xmlschemas.c revision df143a5041f03a22808b59c76698770b74692815
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * schemas.c : implementation of the XML Schema handling and
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *             schema validity checking
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <veillard@redhat.com>
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO:
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - when types are redefined in includes, check that all
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     types in the redef list are equal
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     -> need a type equality operation.
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - if we don't intend to use the schema for schemas, we
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     need to validate all schema attributes (ref, type, name)
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     against their types.
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - Eliminate item creation for: ??
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO:
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - For xsi-driven schema acquisition, augment the IDCs after every
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     acquisition episode (xmlSchemaAugmentIDC).
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTES:
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - Elimated item creation for: <restriction>, <extension>,
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     <simpleContent>, <complexContent>, <list>, <union>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * PROBLEMS:
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0337.html
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     IDC XPath expression and chameleon includes: the targetNamespace is changed, so
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     XPath will have trouble to resolve to this namespace, since not known.
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * CONSTRAINTS:
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   All Group Limited (cos-all-limited)
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Status: complete
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   (1.2)
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     In xmlSchemaGroupDefReferenceTermFixup() and
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   (2)
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     In xmlSchemaParseModelGroup()
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     TODO: Actually this should go to component-level checks,
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     but is done here due to performance. Move it to an other layer
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     is schema construction via an API is implemented.
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SCHEMAS_ENABLED
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h>
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h>
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemas.h>
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/schemasInternals.h>
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h>
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlautomata.h>
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlregexp.h>
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/dict.h>
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/encoding.h>
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlIO.h>
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_PATTERN_ENABLED
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h>
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlreader.h>
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG 1 */
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_CONTENT 1 */
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_TYPE 1 */
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_CONTENT_REGEXP 1 */
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_AUTOMATA 1 */
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_IDC */
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define DEBUG_IDC_NODE_TABLE */
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define WXS_ELEM_DECL_CONS_ENABLED */
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project #ifndef DEBUG_IDC_NODE_TABLE
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  #define DEBUG_IDC_NODE_TABLE
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project #endif
9360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define ENABLE_PARTICLE_RESTRICTION 1 */
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ENABLE_REDEFINE
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define ENABLE_NAMED_LOCALS */
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define ENABLE_IDC_NODE_TABLES_TEST */
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DUMP_CONTENT_MODEL
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* #define XML_SCHEMA_READER_ENABLED */
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define UNBOUNDED (1 << 30)
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO 								\
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_NO_NAMESPACE (const xmlChar *) "##"
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The XML Schemas namespaces
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlSchemaNs = (const xmlChar *)
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "http://www.w3.org/2001/XMLSchema";
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlSchemaInstanceNs = (const xmlChar *)
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "http://www.w3.org/2001/XMLSchema-instance";
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlNamespaceNs = (const xmlChar *)
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "http://www.w3.org/2000/xmlns/";
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Come casting macros.
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTXT_CAST (xmlSchemaAbstractCtxtPtr)
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PCTXT_CAST (xmlSchemaParserCtxtPtr)
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VCTXT_CAST (xmlSchemaValidCtxtPtr)
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_BASIC_CAST (xmlSchemaBasicItemPtr)
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TREE_CAST (xmlSchemaTreeItemPtr)
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_PTC_CAST (xmlSchemaParticlePtr)
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_CAST (xmlSchemaTypePtr)
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ELEM_CAST (xmlSchemaElementPtr)
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_GROUP_CAST (xmlSchemaAttributeGroupPtr)
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_CAST (xmlSchemaAttributePtr)
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_USE_CAST (xmlSchemaAttributeUsePtr)
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_PROHIB_CAST (xmlSchemaAttributeUseProhibPtr)
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_MODEL_GROUPDEF_CAST (xmlSchemaModelGroupDefPtr)
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_MODEL_GROUP_CAST (xmlSchemaModelGroupPtr)
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IDC_CAST (xmlSchemaIDCPtr)
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_QNAME_CAST (xmlSchemaQNameRefPtr)
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_LIST_CAST (xmlSchemaItemListPtr)
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros to query common properties of components.
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ITEM_NODE(i) xmlSchemaGetComponentNode(WXS_BASIC_CAST (i))
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ITEM_TYPE_NAME(i) xmlSchemaGetComponentTypeStr(WXS_BASIC_CAST (i))
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for element declarations.
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ELEM_TYPEDEF(e) (e)->subtypes
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_SUBST_HEAD(item) (item)->refDecl
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for attribute declarations.
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_TYPEDEF(a) (a)->subtypes
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for attribute uses.
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTRUSE_DECL(au) WXS_ATTR_CAST (WXS_ATTR_USE_CAST (au))->attrDecl
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTRUSE_TYPEDEF(au) WXS_ATTR_TYPEDEF(WXS_ATTRUSE_DECL( WXS_ATTR_USE_CAST au))
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTRUSE_DECL_NAME(au) (WXS_ATTRUSE_DECL(au))->name
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTRUSE_DECL_TNS(au) (WXS_ATTRUSE_DECL(au))->targetNamespace
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for attribute groups.
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_GROUP_HAS_REFS(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS)
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_GROUP_EXPANDED(ag) ((WXS_ATTR_GROUP_CAST (ag))->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED)
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for particles.
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_PARTICLE(p) WXS_PTC_CAST (p)
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_PARTICLE_TERM(p) (WXS_PARTICLE(p))->children
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_PARTICLE_TERM_AS_ELEM(p) (WXS_ELEM_CAST WXS_PARTICLE_TERM(p))
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_PARTICLE_MODEL(p) WXS_MODEL_GROUP_CAST WXS_PARTICLE(p)->children
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for model groups definitions.
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_MODELGROUPDEF_MODEL(mgd) (WXS_MODEL_GROUP_CAST (mgd))->children
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for model groups.
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_MODEL_GROUP(i) \
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((i)->type == XML_SCHEMA_TYPE_SEQUENCE) || \
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     ((i)->type == XML_SCHEMA_TYPE_CHOICE) || \
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     ((i)->type == XML_SCHEMA_TYPE_ALL))
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_MODELGROUP_PARTICLE(mg) WXS_PTC_CAST (mg)->children
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for schema buckets.
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_BUCKET_INCREDEF(t) (((t) == XML_SCHEMA_SCHEMA_INCLUDE) || \
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((t) == XML_SCHEMA_SCHEMA_REDEFINE))
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_BUCKET_IMPMAIN(t) (((t) == XML_SCHEMA_SCHEMA_MAIN) || \
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((t) == XML_SCHEMA_SCHEMA_IMPORT))
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IMPBUCKET(b) ((xmlSchemaImportPtr) (b))
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_INCBUCKET(b) ((xmlSchemaIncludePtr) (b))
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for complex/simple types.
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_ANYTYPE(i) \
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (( (i)->type == XML_SCHEMA_TYPE_BASIC) && \
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      ( (WXS_TYPE_CAST (i))->builtInType == XML_SCHEMAS_ANYTYPE))
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_COMPLEX(i) \
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((i)->type == XML_SCHEMA_TYPE_COMPLEX) || \
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     ((i)->builtInType == XML_SCHEMAS_ANYTYPE))
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_SIMPLE(item) \
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((item->type == XML_SCHEMA_TYPE_SIMPLE) || \
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     ((item->type == XML_SCHEMA_TYPE_BASIC) && \
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      (item->builtInType != XML_SCHEMAS_ANYTYPE)))
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_ANY_SIMPLE_TYPE(i) \
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((i)->type == XML_SCHEMA_TYPE_BASIC) && \
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      ((i)->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_RESTRICTION(t) \
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION)
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_EXTENSION(t) \
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((t)->flags & XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION)
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_TYPE_NOT_FIXED(i) \
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((i)->type != XML_SCHEMA_TYPE_BASIC) && \
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (((i)->flags & XML_SCHEMAS_TYPE_INTERNAL_RESOLVED) == 0))
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_TYPE_NOT_FIXED_1(item) \
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((item)->type != XML_SCHEMA_TYPE_BASIC) && \
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (((item)->flags & XML_SCHEMAS_TYPE_FIXUP_1) == 0))
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_IS_GLOBAL(t) ((t)->flags & XML_SCHEMAS_TYPE_GLOBAL)
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_IS_LOCAL(t) (((t)->flags & XML_SCHEMAS_TYPE_GLOBAL) == 0)
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for exclusively for complex types.
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_HAS_COMPLEX_CONTENT(item) \
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((item->contentType == XML_SCHEMA_CONTENT_MIXED) || \
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (item->contentType == XML_SCHEMA_CONTENT_EMPTY) || \
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (item->contentType == XML_SCHEMA_CONTENT_ELEMENTS))
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_HAS_SIMPLE_CONTENT(item) \
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ((item->contentType == XML_SCHEMA_CONTENT_SIMPLE) || \
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     (item->contentType == XML_SCHEMA_CONTENT_BASIC))
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_HAS_MIXED_CONTENT(item) \
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (item->contentType == XML_SCHEMA_CONTENT_MIXED)
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_EMPTIABLE(t) \
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlSchemaIsParticleEmptiable(WXS_PTC_CAST (t)->subtypes))
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_CONTENTTYPE(t) (t)->subtypes
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_PARTICLE(t) WXS_PTC_CAST (t)->subtypes
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_TYPE_PARTICLE_TERM(t) WXS_PARTICLE_TERM(WXS_TYPE_PARTICLE(t))
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Macros for exclusively for simple types.
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_LIST_ITEMTYPE(t) (t)->subtypes
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_ATOMIC(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_ATOMIC)
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_LIST(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_LIST)
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_IS_UNION(t) (t->flags & XML_SCHEMAS_TYPE_VARIETY_UNION)
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Misc parser context macros.
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_CONSTRUCTOR(ctx) (ctx)->constructor
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_HAS_BUCKETS(ctx) \
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project( (WXS_CONSTRUCTOR((ctx))->buckets != NULL) && \
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(WXS_CONSTRUCTOR((ctx))->buckets->nbItems > 0) )
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_SUBST_GROUPS(ctx) WXS_CONSTRUCTOR((ctx))->substGroups
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_BUCKET(ctx) WXS_CONSTRUCTOR((ctx))->bucket
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_SCHEMA(ctx) (ctx)->schema
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ADD_LOCAL(ctx, item) \
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->locals), 10, item)
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ADD_GLOBAL(ctx, item) \
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAddItemSize(&(WXS_BUCKET(ctx)->globals), 5, item)
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ADD_PENDING(ctx, item) \
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAddItemSize(&((ctx)->constructor->pending), 10, item)
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaItemList macros.
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ILIST_IS_EMPTY(l) ((l == NULL) || ((l)->nbItems == 0))
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Misc macros.
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_SCHEMA(node, type) \
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   ((node != NULL) && (node->ns != NULL) && \
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlStrEqual(node->name, (const xmlChar *) type)) && \
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlStrEqual(node->ns->href, xmlSchemaNs)))
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FREE_AND_NULL(str) if ((str) != NULL) { xmlFree((xmlChar *) (str)); str = NULL; }
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Since we put the default/fixed values into the dict, we can
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* use pointer comparison for those values.
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* REMOVED: (xmlStrEqual((v1), (v2)))
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ARE_DEFAULT_STR_EQUAL(v1, v2) ((v1) == (v2))
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define INODE_NILLED(item) (item->flags & XML_SCHEMA_ELEM_INFO_NILLED)
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define CAN_PARSE_SCHEMA(b) (((b)->doc != NULL) && ((b)->parsed == 0))
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HFAILURE if (res == -1) goto exit_failure;
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HERROR if (res != 0) goto exit_error;
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define HSTOP(ctx) if ((ctx)->stop) goto exit;
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Some flags used for various schema constraints.
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SUBSET_RESTRICTION  1<<0
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SUBSET_EXTENSION    1<<1
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SUBSET_SUBSTITUTION 1<<2
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SUBSET_LIST         1<<3
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SUBSET_UNION        1<<4
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaNodeInfo xmlSchemaNodeInfo;
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaNodeInfo *xmlSchemaNodeInfoPtr;
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaItemList xmlSchemaItemList;
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaItemList *xmlSchemaItemListPtr;
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaItemList {
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **items;  /* used for dynamic addition of schemata */
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbItems; /* used for dynamic addition of schemata */
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeItems; /* used for dynamic addition of schemata */
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_CTXT_PARSER 1
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_CTXT_VALIDATOR 2
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaAbstractCtxt xmlSchemaAbstractCtxt;
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaAbstractCtxt *xmlSchemaAbstractCtxtPtr;
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaAbstractCtxt {
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type; /* E.g. XML_SCHEMA_CTXT_VALIDATOR */
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaBucket xmlSchemaBucket;
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaBucket *xmlSchemaBucketPtr;
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_SCHEMA_MAIN 0
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_SCHEMA_IMPORT 1
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_SCHEMA_INCLUDE 2
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_SCHEMA_REDEFINE 3
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
37760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaSchemaRelation:
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to create a graph of schema relationships.
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaSchemaRelation xmlSchemaSchemaRelation;
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaSchemaRelation *xmlSchemaSchemaRelationPtr;
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSchemaRelation {
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr next;
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type; /* E.g. XML_SCHEMA_SCHEMA_IMPORT */
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *importNamespace;
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket;
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_BUCKET_MARKED 1<<0
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_BUCKET_COMPS_ADDED 1<<1
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaBucket {
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *schemaLocation;
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *origTargetNamespace;
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr relations;
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int located;
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int parsed;
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int imported;
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int preserveDoc;
40560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaItemListPtr globals; /* Global components. */
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr locals; /* Local components. */
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
41060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaImport:
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (extends xmlSchemaBucket)
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reflects a schema. Holds some information
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * about the schema and its toplevel components. Duplicate
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * toplevel components are not checked at this level.
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaImport xmlSchemaImport;
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaImport *xmlSchemaImportPtr;
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaImport {
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type; /* Main OR import OR include. */
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *schemaLocation; /* The URI of the schema document. */
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* For chameleon includes, @origTargetNamespace will be NULL */
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *origTargetNamespace;
42560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For chameleon includes, @targetNamespace will be the
42760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * targetNamespace of the including schema.
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc; /* The schema node-tree. */
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @relations will hold any included/imported/redefined schemas. */
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr relations;
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int located;
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int parsed;
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int imported;
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int preserveDoc;
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr globals;
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr locals;
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The imported schema. */
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr schema;
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* (extends xmlSchemaBucket)
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaInclude xmlSchemaInclude;
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaInclude *xmlSchemaIncludePtr;
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaInclude {
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *schemaLocation;
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *origTargetNamespace;
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr relations;
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int located;
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int parsed;
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int imported;
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int preserveDoc;
46060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaItemListPtr globals; /* Global components. */
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr locals; /* Local components. */
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The owning main or import schema bucket. */
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaImportPtr ownerImport;
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaBasicItem:
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The abstract base type for schema components.
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaBasicItem xmlSchemaBasicItem;
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaBasicItem *xmlSchemaBasicItemPtr;
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaBasicItem {
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAnnotItem:
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The abstract base type for annotated schema components.
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaBasicItem)
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaAnnotItem xmlSchemaAnnotItem;
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaAnnotItem *xmlSchemaAnnotItemPtr;
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaAnnotItem {
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTreeItem:
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The abstract base type for tree-like structured schema components.
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaAnnotItem)
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaTreeItem {
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next;
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children;
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_USE_FIXED 1<<0
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeUsePtr:
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The abstract base type for tree-like structured schema components.
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaTreeItem)
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaAttributeUse xmlSchemaAttributeUse;
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaAttributeUse *xmlSchemaAttributeUsePtr;
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaAttributeUse {
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr next; /* The next attr. use. */
52060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The attr. decl. OR a QName-ref. to an attr. decl. OR
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a QName-ref. to an attribute group definition.
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr attrDecl;
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int occurs; /* required, optional */
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar * defValue;
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr defVal;
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeUseProhibPtr:
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A helper component to reflect attribute prohibitions.
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaBasicItem)
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaAttributeUseProhib xmlSchemaAttributeUseProhib;
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaAttributeUseProhib *xmlSchemaAttributeUseProhibPtr;
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaAttributeUseProhib {
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type; /* == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB */
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isRef;
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaRedef:
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaRedef xmlSchemaRedef;
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaRedef *xmlSchemaRedefPtr;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaRedef {
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr next;
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item; /* The redefining component. */
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr reference; /* The referencing component. */
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr target; /* The to-be-redefined component. */
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *refName; /* The name of the to-be-redefined component. */
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *refTargetNs; /* The target namespace of the
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   to-be-redefined comp. */
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr targetBucket; /* The redefined schema. */
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaConstructionCtxt:
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaConstructionCtxt xmlSchemaConstructionCtxt;
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaConstructionCtxt *xmlSchemaConstructionCtxtPtr;
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaConstructionCtxt {
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr mainSchema; /* The main schema. */
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr mainBucket; /* The main schema bucket */
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr buckets; /* List of schema buckets. */
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaItemListPtr relations; */ /* List of schema relations. */
57660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaBucketPtr bucket; /* The current schema bucket */
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr pending; /* All Components of all schemas that
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     need to be fixed. */
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr substGroups;
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redefs;
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr lastRedef;
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_PARSE_ERROR		1
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SCHEMAS_PARSE_OPTIONS XML_PARSE_NOENT
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaParserCtxt {
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *errCtxt;             /* user specific error context */
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidityWarningFunc warning;       /* the callback in case of warning */
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err;
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nberrors;
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaConstructionCtxtPtr constructor;
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ownsConstructor; /* TODO: Move this to parser *flags*. */
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaPtr topschema;	*/
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlHashTablePtr namespaces;  */
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr schema;        /* The main schema in use */
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int counter;
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *URL;
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int preserve;		/* Whether the doc should be freed  */
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *buffer;
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Used to build complex element content models
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataPtr am;
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr start;
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr end;
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr state;
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;		/* dictionnary for interned string names */
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ctxtType; /* The current context simple/complex type */
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int options;
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt;
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isS4S;
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isRedefine;
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int xsiAssemble;
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int stop; /* If the parser should stop; i.e. a critical error. */
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr redefined; /* The schema to be redefined. */
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redef; /* Used for redefinitions. */
63260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int redefCounter; /* Used for redefinitions. */
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr attrProhibs;
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaQNameRef:
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A component reference item (not a schema component)
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaBasicItem)
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaQNameRef xmlSchemaQNameRef;
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaQNameRef *xmlSchemaQNameRefPtr;
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaQNameRef {
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item; /* The resolved referenced item. */
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType itemType;
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParticle:
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A particle component.
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaTreeItem)
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaParticle xmlSchemaParticle;
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaParticle *xmlSchemaParticlePtr;
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaParticle {
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next; /* next particle */
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children; /* the "term" (e.g. a model group,
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	a group definition, a XML_SCHEMA_EXTRA_QNAMEREF (if a reference),
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        etc.) */
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int minOccurs;
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxOccurs;
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaModelGroup:
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A model group component.
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaTreeItem)
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaModelGroup {
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_SEQUENCE, XML_SCHEMA_TYPE_CHOICE, XML_SCHEMA_TYPE_ALL */
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next; /* not used */
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children; /* first particle (OR "element decl" OR "wildcard") */
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_MODEL_GROUP_DEF_MARKED 1<<0
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED 1<<1
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaModelGroupDef:
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A model group definition component.
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaTreeItem)
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaModelGroupDef xmlSchemaModelGroupDef;
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaModelGroupDef *xmlSchemaModelGroupDefPtr;
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaModelGroupDef {
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type; /* XML_SCHEMA_TYPE_GROUP */
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr next; /* not used */
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr children; /* the "model group" */
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaIDC xmlSchemaIDC;
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaIDC *xmlSchemaIDCPtr;
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCSelect:
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The identity-constraint "field" and "selector" item, holding the
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath expression.
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaIDCSelect xmlSchemaIDCSelect;
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaIDCSelect *xmlSchemaIDCSelectPtr;
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaIDCSelect {
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr next;
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr idc;
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int index; /* an index position if significant for IDC key-sequences */
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *xpath; /* the XPath expression */
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *xpathComp; /* the compiled XPath expression */
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDC:
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The identity-constraint definition component.
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (Extends xmlSchemaAnnotItem)
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaIDC {
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType type;
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr next;
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace;
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr selector;
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr fields;
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbFields;
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref;
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAug:
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The augmented IDC information used for validation.
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaIDCAug xmlSchemaIDCAug;
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaIDCAug *xmlSchemaIDCAugPtr;
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaIDCAug {
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr next; /* next in a list */
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr def; /* the IDC definition */
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int keyrefDepth; /* the lowest tree level to which IDC
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tables need to be bubbled upwards */
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPSVIIDCKeySequence:
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The key sequence of a node table item.
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaPSVIIDCKey xmlSchemaPSVIIDCKey;
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaPSVIIDCKey *xmlSchemaPSVIIDCKeyPtr;
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaPSVIIDCKey {
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val;
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPSVIIDCNode:
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The node table item of a node table.
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaPSVIIDCNode xmlSchemaPSVIIDCNode;
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaPSVIIDCNode *xmlSchemaPSVIIDCNodePtr;
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaPSVIIDCNode {
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr *keys;
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nodeLine;
78660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int nodeQNameID;
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPSVIIDCBinding:
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The identity-constraint binding item of the [identity-constraint table].
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaPSVIIDCBinding xmlSchemaPSVIIDCBinding;
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaPSVIIDCBinding *xmlSchemaPSVIIDCBindingPtr;
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaPSVIIDCBinding {
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr next; /* next binding of a specific node */
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr definition; /* the IDC definition */
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr *nodeTable; /* array of key-sequences */
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbNodes; /* number of entries in the node table */
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeNodes; /* size of the node table */
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr dupls;
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STATE_OBJ_TYPE_IDC_SELECTOR 1
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STATE_OBJ_TYPE_IDC_FIELD 2
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STATE_OBJ_MATCHES -2
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XPATH_STATE_OBJ_BLOCKED -3
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaIDCMatcher xmlSchemaIDCMatcher;
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaIDCMatcher *xmlSchemaIDCMatcherPtr;
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCStateObj:
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The state object used to evaluate XPath expressions.
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaIDCStateObj xmlSchemaIDCStateObj;
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaIDCStateObj *xmlSchemaIDCStateObjPtr;
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaIDCStateObj {
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr next; /* next if in a list */
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth; /* depth of creation */
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int *history; /* list of (depth, state-id) tuples */
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbHistory;
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeHistory;
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher; /* the correspondent field/selector
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       matcher */
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr sel;
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *xpathCtxt;
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IDC_MATCHER 0
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCMatcher:
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to evaluate IDC selectors (and fields).
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaIDCMatcher {
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth; /* the tree depth at creation time */
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr next; /* next in the list */
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr nextCached; /* next in the cache list */
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc; /* the augmented IDC item */
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idcType;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr **keySeqs; /* the key-sequences of the target
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         elements */
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeKeySeqs;
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr targets; /* list of target-node
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     (xmlSchemaPSVIIDCNodePtr) entries */
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Element info flags.
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES  1<<0
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES 1<<1
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_NILLED	       1<<2
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_LOCAL_TYPE	       1<<3
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_NODE_INFO_VALUE_NEEDED      1<<4
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_EMPTY             1<<5
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_HAS_CONTENT       1<<6
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT  1<<7
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT  1<<8
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED  1<<9
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE  1<<10
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNodeInfo:
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Holds information of an element node.
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaNodeInfo {
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nodeType;
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
88260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int nodeLine;
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *localName;
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val; /* the pre-computed value if any */
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags; /* combination of node info flags */
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int valNeeded;
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int normVal;
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr decl; /* the element/attribute declaration */
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth;
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            for the scope element*/
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           element */
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr regexCtxt;
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar **nsBindings; /* Namespace bindings on this element */
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbNsBindings;
90460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int sizeNsBindings;
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasKeyrefs;
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int appliedXPath; /* Indicates that an XPath has been applied. */
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_UNKNOWN 1
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ASSESSED 2
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_PROHIBITED 3
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_MISSING 4
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_INVALID_VALUE 5
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_DEFAULT 8
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_WILD_SKIP 13
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMAS_ATTR_META 17
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* @metaType values of xmlSchemaAttrInfo.
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaAttrInfo {
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nodeType;
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
94160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    int nodeLine;
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *localName;
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val; /* the pre-computed value if any */
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags; /* combination of node info flags */
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr decl; /* the attribute declaration */
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr use;  /* the attribute use */
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int state;
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int metaType;
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *vcValue; /* the value constraint value */
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr parent;
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidCtxt:
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schemas validation context
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaValidCtxt {
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *errCtxt;             /* user specific data block */
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidityErrorFunc error;   /* the callback in case of errors */
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr schema;        /* The schema in use */
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr input;
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncoding enc;
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr sax;
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserCtxtPtr parserCtxt;
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *user_data; /* TODO: What is this for? */
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err;
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nberrors;
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaTypePtr type; */
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr regexp;
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr value;
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int valueWS;
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int options;
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr validationRoot;
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr pctxt;
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int xsiAssemble;
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth;
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeElemInfos;
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode; /* the current element information */
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbIdcNodes;
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeIdcNodes;
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbIdcKeys;
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeIdcKeys;
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictPtr dict;
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlTextReaderPtr reader;
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr *attrInfos;
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrInfos;
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int sizeAttrInfos;
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int skipDepth;
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr nodeQNames;
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasKeyrefs;
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int createIDCNodeTables;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int psviExposeIDCNodeTables;
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSubstGroup:
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSubstGroup {
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr head;
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr members;
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Some predeclarations				*
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt,
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlSchemaPtr schema,
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlNodePtr node);
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt,
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlSchemaPtr schema,
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlNodePtr node);
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixup(xmlSchemaTypePtr type,
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlSchemaAbstractCtxtPtr ctxt);
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetTypeToString(xmlSchemaTypeType type);
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlNodePtr node);
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlSchemaParserCtxtPtr ctxt);
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWhitespaceValueType
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type);
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node, xmlSchemaTypeType type,
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int withParticle);
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item);
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypeLinkPtr
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type);
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message);
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt,
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int subset);
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt);
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComponentListFree(xmlSchemaItemListPtr list);
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node);
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Helper functions			        *
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaItemTypeToStr:
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of the schema item
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the component name of a schema item.
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemTypeToStr(xmlSchemaTypeType type)
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "simple type definition");
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "simple type definition");
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "complex type definition");
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "element declaration");
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute use");
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute declaration");
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group definition");
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "attribute group definition");
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "notation declaration");
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (sequence)");
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (choice)");
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "model group (all)");
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "particle");
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "unique identity-constraint");
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (unique)"); */
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "key identity-constraint");
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (key)"); */
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "keyref identity-constraint");
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* return(BAD_CAST "IDC (keyref)"); */
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "wildcard (any)");
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "[helper component] QName reference");
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "[helper component] attribute use prohibition");
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(BAD_CAST "Not a schema component");
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetComponentTypeStr:
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of the schema item
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the component name of a schema item.
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item)
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(WXS_TYPE_CAST item))
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(BAD_CAST "complex type definition");
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
117560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(BAD_CAST "simple type definition");
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(xmlSchemaItemTypeToStr(item->type));
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetComponentNode:
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a schema component
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns node associated with the schema component.
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that such a node need not be available; plus, a component's
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node need not to reflect the component directly, since there is no
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * one-to-one relationship between the XML Schema representation and
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the component representation.
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item)
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->node);
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->node);
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->node);
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaWildcardPtr) item)->node);
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaParticlePtr) item)->node);
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupPtr) item)->node);
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->node);
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->node);
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->node);
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(((xmlSchemaQNameRefPtr) item)->node);
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: What to do with NOTATIONs?
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->node);
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeUsePtr) item)->node);
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetNextComponent:
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a schema component
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the next sibling of the schema component.
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item)
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next);
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next);
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next);
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next);
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next);
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next);
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatQName:
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespaceName:  the namespace name
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @localName: the local name
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the given QName in the format "{namespaceName}localName" or
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * just "localName" if @namespaceName is NULL.
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the localName if @namespaceName is NULL, a formatted
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string otherwise.
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatQName(xmlChar **buf,
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *namespaceName,
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *localName)
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(*buf)
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespaceName != NULL) {
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrdup(BAD_CAST "{");
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, namespaceName);
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "}");
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (localName != NULL) {
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaceName == NULL)
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(localName);
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, localName);
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "(NULL)");
130360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((const xmlChar *) *buf);
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
130760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic const xmlChar*
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName)
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL)
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(buf, ns->href, localName));
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(buf, NULL, localName));
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentName(xmlSchemaBasicItemPtr item)
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->name);
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->name);
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->name);
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->name);
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->name);
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->name);
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_DECL(item) != NULL) {
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaGetComponentName(
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaQNameRefPtr) item)->name);
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->name);
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Other components cannot have names.
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlSchemaGetQNameRefName(r) (WXS_QNAME_CAST (r))->name
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define xmlSchemaGetQNameRefTargetNs(r) (WXS_QNAME_CAST (r))->targetNamespace
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetQNameRefName(void *ref)
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((xmlSchemaQNameRefPtr) ref)->name);
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetQNameRefTargetNs(void *ref)
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(((xmlSchemaQNameRefPtr) ref)->targetNamespace);
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentTargetNs(xmlSchemaBasicItemPtr item)
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaElementPtr) item)->targetNamespace);
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributePtr) item)->targetNamespace);
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaAttributeGroupPtr) item)->targetNamespace);
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC:
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "http://www.w3.org/2001/XMLSchema");
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaTypePtr) item)->targetNamespace);
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaModelGroupDefPtr) item)->targetNamespace);
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaIDCPtr) item)->targetNamespace);
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_DECL(item) != NULL) {
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(xmlSchemaGetComponentTargetNs(
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST WXS_ATTRUSE_DECL(item)));
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Will returning NULL break something? */
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_EXTRA_QNAMEREF:
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaQNameRefPtr) item)->targetNamespace);
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION:
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (((xmlSchemaNotationPtr) item)->targetNamespace);
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Other components cannot have names.
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentQName(xmlChar **buf,
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   void *item)
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaFormatQName(buf,
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetComponentTargetNs((xmlSchemaBasicItemPtr) item),
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetComponentName((xmlSchemaBasicItemPtr) item)));
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetComponentDesignation(xmlChar **buf, void *item)
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, WXS_ITEM_TYPE_NAME(item));
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST " '");
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str,
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaBasicItemPtr) item));
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST "'");
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str);
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(*buf);
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar*
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetIDCDesignation(xmlChar **buf, xmlSchemaIDCPtr idc)
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaGetComponentDesignation(buf, idc));
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaWildcardPCToString:
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pc: the type of processContents
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a string representation of the type of
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * processContents.
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaWildcardPCToString(int pc)
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (pc) {
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_SKIP:
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "skip");
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_LAX:
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "lax");
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANY_STRICT:
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "strict");
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (BAD_CAST "invalid process contents");
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCanonValueWhtspExt:
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precomputed value
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @retValue: the returned value
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ws: the whitespace type of the value
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get a the cononical representation of the value.
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The caller has to free the returned retValue.
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value could be built and -1 in case of
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         API errors or if the value type is not supported yet.
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCanonValueWhtspExt(xmlSchemaValPtr val,
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaWhitespaceValueType ws,
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlChar **retValue)
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int list;
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValType valType;
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value, *value2 = NULL;
148360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retValue == NULL) || (val == NULL))
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = xmlSchemaValueGetNext(val) ? 1 : 0;
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *retValue = NULL;
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
149060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	value = NULL;
149160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	valType = xmlSchemaGetValType(val);
149260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	switch (valType) {
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_STRING:
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_NORMSTRING:
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ANYSIMPLETYPE:
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = xmlSchemaValueGetAsString(val);
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (value != NULL) {
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value2 = xmlSchemaCollapseString(value);
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value2 = xmlSchemaWhiteSpaceReplace(value);
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (value2 != NULL)
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = value2;
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
150560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaGetCanonValue(val, &value2) == -1) {
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (value2 != NULL)
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree((xmlChar *) value2);
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = value2;
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*retValue == NULL)
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value == NULL) {
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! list)
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *retValue = xmlStrdup(BAD_CAST "");
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*retValue = xmlStrdup(value);
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (value != NULL) {
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* List. */
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = xmlStrcat((xmlChar *) *retValue, BAD_CAST " ");
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retValue = xmlStrcat((xmlChar *) *retValue, value);
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(value2)
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaValueGetNext(val);
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (val != NULL);
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*retValue != NULL)
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *) (*retValue));
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value2 != NULL)
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *) value2);
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatItemForReport:
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the item
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemName: the name of the item
154360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @item: the item as an object
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemNode: the node of the item
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the local name
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parsing: if the function is used during the parse
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a representation of the given item used
154960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * for error reports.
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
155160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * The following order is used to build the resulting
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * designation if the arguments are not NULL:
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1a. If itemDes not NULL -> itemDes
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1b. If (itemDes not NULL) and (itemName not NULL)
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     -> itemDes + itemName
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 2. If the preceding was NULL and (item not NULL) -> item
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 3. If the preceding was NULL and (itemNode not NULL) -> itemNode
155860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the itemNode is an attribute node, the name of the attribute
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be appended to the result.
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the formatted string and sets @buf to the resulting value.
156360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
156460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlChar*
156560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaFormatItemForReport(xmlChar **buf,
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *itemDes,
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBasicItemPtr item,
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr itemNode)
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int named = 1;
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*buf != NULL) {
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(*buf);
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = NULL;
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
157760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (itemDes != NULL) {
157960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*buf = xmlStrdup(itemDes);
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (item != NULL) {
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_BASIC: {
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "atomic type 'xs:");
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "list type 'xs:");
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "union type 'xs:");
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "simple type 'xs:");
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, type->name);
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE: {
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST"");
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "local ");
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "atomic type");
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "list type");
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "union type");
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "simple type");
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, type->name);
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX: {
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr type = WXS_TYPE_CAST item;
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL)
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "");
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "local ");
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "complex type");
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_GLOBAL) {
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, type->name);
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE_USE: {
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributeUsePtr ause;
163760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ause = WXS_ATTR_USE_CAST item;
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "attribute use ");
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_ATTRUSE_DECL(ause) != NULL) {
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "'");
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf,
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, WXS_ATTRUSE_DECL(ause)));
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*buf = xmlStrcat(*buf, BAD_CAST "'");
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "(unknown)");
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE: {
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributePtr attr;
165360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = (xmlSchemaAttributePtr) item;
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "attribute decl.");
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr->targetNamespace, attr->name));
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *buf = xmlStrcat(*buf, BAD_CAST "'");
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentDesignation(buf, item);
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT: {
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaElementPtr elem;
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
166960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elem = (xmlSchemaElementPtr) item;
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "element decl.");
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem->targetNamespace, elem->name));
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE:
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
167960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	case XML_SCHEMA_TYPE_IDC_KEYREF:
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->type == XML_SCHEMA_TYPE_IDC_UNIQUE)
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "unique '");
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (item->type == XML_SCHEMA_TYPE_IDC_KEY)
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "key '");
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "keyRef '");
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, ((xmlSchemaIDCPtr) item)->name);
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY:
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(xmlSchemaWildcardPCToString(
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaWildcardPtr) item)->processContents));
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST " wildcard");
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MININCLUSIVE:
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINEXCLUSIVE:
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXINCLUSIVE:
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_TOTALDIGITS:
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_FRACTIONDIGITS:
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_PATTERN:
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION:
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_WHITESPACE:
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_LENGTH:
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXLENGTH:
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINLENGTH:
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(BAD_CAST "facet '");
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, xmlSchemaFacetTypeToString(item->type));
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP: {
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "model group def.");
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL:
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION: {
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(WXS_ITEM_TYPE_NAME(item));
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST " '");
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, xmlSchemaGetComponentQName(&str, item));
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST "'");
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    named = 0;
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
173560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	named = 0;
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((named == 0) && (itemNode != NULL)) {
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr elem;
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (itemNode->type == XML_ATTRIBUTE_NODE)
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elem = itemNode->parent;
174360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	else
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elem = itemNode;
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrdup(BAD_CAST "Element '");
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->ns != NULL) {
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf,
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, elem->ns->href, elem->name));
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, elem->name);
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
175360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((itemNode != NULL) && (itemNode->type == XML_ATTRIBUTE_NODE)) {
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST ", attribute '");
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (itemNode->ns != NULL) {
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, xmlSchemaFormatQName(&str,
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		itemNode->ns->href, itemNode->name));
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, itemNode->name);
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
176660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (*buf);
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFormatFacetEnumSet:
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf: the string buffer
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type holding the enumeration facets
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds a string consisting of all enumeration elements.
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a string of all enumeration elements.
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatFacetEnumSet(xmlSchemaAbstractCtxtPtr actxt,
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar **buf, xmlSchemaTypePtr type)
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWhitespaceValueType ws;
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, found = 0;
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*buf != NULL)
178960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlFree(*buf);
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = NULL;
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use the whitespace type of the base type.
179560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = xmlSchemaGetWhiteSpaceFacetValue(type->baseType);
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (facet = type->facets; facet != NULL; facet = facet->next) {
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 1;
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaGetCanonValueWhtspExt(facet->val,
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ws, &value);
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInternalErr(actxt,
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaFormatFacetEnumSet",
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "compute the canonical lexical representation");
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*buf != NULL)
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*buf);
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = NULL;
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*buf == NULL)
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrdup(BAD_CAST "'");
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*buf = xmlStrcat(*buf, BAD_CAST ", '");
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST value);
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (value != NULL) {
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *)value);
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = NULL;
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The enumeration facet of a type restricts the enumeration
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* facet of the ancestor type; i.e., such restricted enumerations
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* do not belong to the set of the given type. Thus we break
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* on the first found enumeration.
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found)
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((type != NULL) && (type->type != XML_SCHEMA_TYPE_BASIC));
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((const xmlChar *) *buf);
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Error functions				        *
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErrMemory(const char *msg)
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     msg);
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPSimpleErr(const char *msg)
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, NULL, NULL,
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     msg);
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErrMemory:
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErrMemory(xmlSchemaParserCtxtPtr ctxt,
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const char *extra, xmlNodePtr node)
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL)
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL,
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     extra);
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErr:
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
188460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErr(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              const char *msg, const xmlChar * str1, const xmlChar * str2)
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->err = error;
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        channel = ctxt->error;
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->errCtxt;
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schannel = ctxt->serror;
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErr2:
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the current child
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
191760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErr2(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               xmlNodePtr child, int error,
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               const char *msg, const xmlChar * str1, const xmlChar * str2)
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL)
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr(ctxt, child, error, msg, str1, str2);
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr(ctxt, node, error, msg, str1, str2);
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPErrExt:
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
193660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @error: the error code
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData1: extra data
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData2: extra data
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strData3: extra data
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra parameter for the message display
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra parameter for the message display
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3:  extra parameter for the message display
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str4:  extra parameter for the message display
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str5:  extra parameter for the message display
194660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPErrExt(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int error,
195160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar * strData1, const xmlChar * strData2,
195260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar * strData3, const char *msg, const xmlChar * str1,
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar * str2, const xmlChar * str3, const xmlChar * str4,
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar * str5)
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->err = error;
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        channel = ctxt->error;
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->errCtxt;
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schannel = ctxt->serror;
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP,
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
197060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott                    (const char *) strData1, (const char *) strData2,
197160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (const char *) strData3, 0, 0, msg, str1, str2,
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    str3, str4, str5);
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Allround error functions			*
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaVTypeErrMemory:
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVErrMemory(xmlSchemaValidCtxtPtr ctxt,
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const char *extra, xmlNodePtr node)
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nberrors++;
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = XML_SCHEMAV_INTERNAL;
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL,
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     extra);
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPSimpleInternalErr(xmlNodePtr node,
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const char *msg, const xmlChar *str)
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     __xmlSimpleError(XML_FROM_SCHEMASP, XML_SCHEMAP_INTERNAL, node,
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 msg, (const char *) str);
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ERROR_TYPE_ERROR 1
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ERROR_TYPE_WARNING 2
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaErr3:
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra data
201960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErr4Line(xmlSchemaAbstractCtxtPtr ctxt,
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlErrorLevel errorLevel,
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int error, xmlNodePtr node, int line, const char *msg,
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str1, const xmlChar *str2,
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str3, const xmlChar *str4)
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
203160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    void *data = NULL;
203260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctxt;
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const char *file = NULL;
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (errorLevel != XML_ERR_WARNING) {
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->nberrors++;
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->err = error;
204060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		channel = vctxt->error;
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		channel = vctxt->warning;
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = vctxt->serror;
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    data = vctxt->errCtxt;
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Error node. If we specify a line number, then
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * do not channel any node to the error function.
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (line == 0) {
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((node == NULL) &&
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->depth >= 0) &&
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->inode != NULL)) {
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node = vctxt->inode->node;
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get filename and line if no node-tree.
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((node == NULL) &&
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt != NULL) &&
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt->input != NULL)) {
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = vctxt->parserCtxt->input->filename;
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    line = vctxt->parserCtxt->input->line;
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Override the given node's (if any) position
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and channel only the given line number.
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = NULL;
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get filename.
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (vctxt->doc != NULL)
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = (const char *) vctxt->doc->URL;
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if ((vctxt->parserCtxt != NULL) &&
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->parserCtxt->input != NULL))
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    file = vctxt->parserCtxt->input->filename;
208060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    __xmlRaiseError(schannel, channel, data, ctxt,
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, XML_FROM_SCHEMASV,
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error, errorLevel, file, line,
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str1, (const char *) str2,
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ctxt->type == XML_SCHEMA_CTXT_PARSER) {
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParserCtxtPtr pctxt = (xmlSchemaParserCtxtPtr) ctxt;
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (errorLevel != XML_ERR_WARNING) {
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->nberrors++;
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->err = error;
209260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		channel = pctxt->error;
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		channel = pctxt->warning;
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = pctxt->serror;
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    data = pctxt->errCtxt;
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    __xmlRaiseError(schannel, channel, data, ctxt,
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, XML_FROM_SCHEMASP, error,
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		errorLevel, NULL, 0,
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str1, (const char *) str2,
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(const char *) str3, 0, 0, msg, str1, str2, str3, str4);
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaErr3:
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: extra data
211860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a validation error
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
212260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaErr3(xmlSchemaAbstractCtxtPtr actxt,
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      int error, xmlNodePtr node, const char *msg,
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      const xmlChar *str1, const xmlChar *str2, const xmlChar *str3)
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, str1, str2, str3, NULL);
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
213160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaErr4(xmlSchemaAbstractCtxtPtr actxt,
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      int error, xmlNodePtr node, const char *msg,
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      const xmlChar *str1, const xmlChar *str2,
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	      const xmlChar *str3, const xmlChar *str4)
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_ERROR, error, node, 0,
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, str1, str2, str3, str4);
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaErr(xmlSchemaAbstractCtxtPtr actxt,
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     int error, xmlNodePtr node, const char *msg,
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     const xmlChar *str1, const xmlChar *str2)
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(actxt, error, node, msg, str1, str2, NULL, NULL);
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatNodeForError(xmlChar ** msg,
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAbstractCtxtPtr actxt,
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodePtr node)
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *msg = NULL;
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node != NULL) &&
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ELEMENT_NODE) &&
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(node->type != XML_ATTRIBUTE_NODE))
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
216060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Don't try to format other nodes than element and
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* attribute nodes.
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Play save and return an empty string.
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrdup(BAD_CAST "");
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(*msg);
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL) {
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Work on tree nodes.
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ATTRIBUTE_NODE) {
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr elem = node->parent;
217460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elem->ns != NULL)
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elem->ns->href, elem->name));
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, elem->name));
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
218460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->ns != NULL)
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node->ns->href, node->name));
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node->name));
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "': ");
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) actxt;
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Work on node infos.
220060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->nodeType == XML_ATTRIBUTE_NODE) {
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaNodeInfoPtr ielem =
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->elemInfos[vctxt->depth];
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsName, ielem->localName));
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrcat(*msg, BAD_CAST "', ");
221060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *msg = xmlStrcat(*msg, BAD_CAST "attribute '");
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *msg = xmlStrdup(BAD_CAST "Element '");
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, xmlSchemaFormatQName(&str,
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName, vctxt->inode->localName));
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "': ");
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
221960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Hmm, no node while parsing?
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Return an empty string, in case NULL will break something.
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrdup(BAD_CAST "");
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * VAL TODO: The output of the given schema component is currently
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * disabled.
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type != NULL) && (xmlSchemaIsGlobalItem(type))) {
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST " [");
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, xmlSchemaFormatItemForReport(&str,
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, type, NULL, 0));
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*msg = xmlStrcat(*msg, BAD_CAST "]");
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (*msg);
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr2(xmlSchemaAbstractCtxtPtr actxt,
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str1,
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str2)
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt == NULL)
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "Internal error: ");
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST funcName);
225760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ", ");
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST message);
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR)
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, XML_SCHEMAV_INTERNAL, NULL,
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) msg, str1, str2);
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
226560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    else if (actxt->type == XML_SCHEMA_CTXT_PARSER)
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, XML_SCHEMAP_INTERNAL, NULL,
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) msg, str1, str2);
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt,
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message)
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInternalErr2(actxt, funcName, message, NULL, NULL);
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPInternalErr(xmlSchemaParserCtxtPtr pctxt,
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *funcName,
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str1,
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *str2)
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInternalErr2(ACTXT_CAST pctxt, funcName, message,
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, str2);
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomErr4(xmlSchemaAbstractCtxtPtr actxt,
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaBasicItemPtr item,
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1, const xmlChar *str2,
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str3, const xmlChar *str4)
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) && (item != NULL) &&
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(actxt->type == XML_SCHEMA_CTXT_PARSER)) {
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = WXS_ITEM_NODE(item);
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&msg, NULL, item, NULL);
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ": ");
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatNodeForError(&msg, actxt, node);
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
231260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ".\n");
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(actxt, error, node,
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, str4);
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomErr(xmlSchemaAbstractCtxtPtr actxt,
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaBasicItemPtr item,
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2)
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCustomErr4(actxt, error, node, item,
232860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	message, str1, str2, NULL, NULL);
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCustomWarning(xmlSchemaAbstractCtxtPtr actxt,
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlNodePtr node,
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2,
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str3)
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
234760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ".\n");
234860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* URGENT TODO: Set the error code to something sane. */
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(actxt, XML_ERR_WARNING, error, node, 0,
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, NULL);
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaKeyrefErr(xmlSchemaValidCtxtPtr vctxt,
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlParserErrors error,
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaPSVIIDCNodePtr idcNode,
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const char *message,
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str1,
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *str2)
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL, *qname = NULL;
236860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
236960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrdup(BAD_CAST "Element '%s': ");
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4Line(ACTXT_CAST vctxt, XML_ERR_ERROR,
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	error, NULL, idcNode->nodeLine, (const char *) msg,
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQName(&qname,
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nodeQNames->items[idcNode->nodeQNameID +1],
237660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    vctxt->nodeQNames->items[idcNode->nodeQNameID]),
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, str2, NULL);
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(qname);
2379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg);
2380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaEvalErrorNodeType(xmlSchemaAbstractCtxtPtr actxt,
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL)
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (node->type);
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((actxt->type == XML_SCHEMA_CTXT_VALIDATOR) &&
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlSchemaValidCtxtPtr) actxt)->inode != NULL))
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ( ((xmlSchemaValidCtxtPtr) actxt)->inode->nodeType);
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsGlobalItem(xmlSchemaTypePtr item)
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (item->type) {
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX:
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->flags & XML_SCHEMAS_TYPE_GLOBAL)
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((xmlSchemaElementPtr) item)->flags &
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_GLOBAL)
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE:
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( ((xmlSchemaAttributePtr) item)->flags &
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ATTR_GLOBAL)
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(1);
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Note that attribute groups are always global. */
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSimpleTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlParserErrors error,
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr node,
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *value,
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type,
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int displayValue)
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_ATTRIBUTE_NODE))
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "The character content is not a valid "
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "value of ");
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! xmlSchemaIsGlobalItem(type))
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "the local ");
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "the ");
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ATOMIC(type))
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "atomic type");
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_IS_LIST(type))
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "list type");
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_IS_UNION(type))
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "union type");
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaIsGlobalItem(type)) {
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " '");
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType != 0) {
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "xs:");
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, type->name);
245960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg,
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str,
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->targetNamespace, type->name));
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'");
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (displayValue || (xmlSchemaEvalErrorNodeType(actxt, node) ==
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_ATTRIBUTE_NODE))
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatErrorNodeQName(xmlChar ** str,
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaNodeInfoPtr ni,
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlNodePtr node)
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node != NULL) {
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->ns != NULL)
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaFormatQName(str, node->ns->href, node->name));
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaFormatQName(str, NULL, node->name));
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ni != NULL)
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaFormatQName(str, ni->nsName, ni->localName));
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIllegalAttrErr(xmlSchemaAbstractCtxtPtr actxt,
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAttrInfoPtr ni,
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node)
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL, *str = NULL;
249760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "The attribute '%s' is not allowed.\n");
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr(actxt, error, node, (const char *) msg,
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatErrorNodeQName(&str, (xmlSchemaNodeInfoPtr) ni, node),
250260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	NULL);
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComplexTypeErr(xmlSchemaAbstractCtxtPtr actxt,
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlParserErrors error,
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlNodePtr node,
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *message,
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nbval,
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nbneg,
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar **values)
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *localName, *nsName;
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur, *end;
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
252160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".");
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that is does not make sense to report that we have a
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard here, since the wildcard might be unfolded into
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * multiple transitions.
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nbval + nbneg > 0) {
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nbval + nbneg > 1) {
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrdup(BAD_CAST " Expected is one of ( ");
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrdup(BAD_CAST " Expected is ( ");
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = NULL;
253660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < nbval + nbneg; i++) {
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = values[i];
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == NULL)
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        continue;
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur[0] == 'n') && (cur[1] == 'o') && (cur[2] == 't') &&
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (cur[3] == ' ')) {
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur += 4;
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		str = xmlStrcat(str, BAD_CAST "##other");
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the local name.
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    localName = NULL;
255060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*end == '*') {
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		localName = xmlStrdup(BAD_CAST "*");
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while ((*end != 0) && (*end != '|'))
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    end++;
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		localName = xmlStrncat(localName, BAD_CAST cur, end - cur);
255960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
256060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (*end != 0) {
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Skip "*|*" if they come with negated expressions, since
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* they represent the same negated wildcard.
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((nbneg == 0) || (*end != '*') || (*localName != '*')) {
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Get the namespace name.
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = end;
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*end == '*') {
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrdup(BAD_CAST "{*}");
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while (*end != 0)
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    end++;
257660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (i >= nbval)
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    nsName = xmlStrdup(BAD_CAST "{##other:");
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    nsName = xmlStrdup(BAD_CAST "{");
258160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrncat(nsName, BAD_CAST cur, end - cur);
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = xmlStrcat(nsName, BAD_CAST "}");
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    str = xmlStrcat(str, BAD_CAST nsName);
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(nsName)
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(localName);
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
259160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str = xmlStrcat(str, BAD_CAST localName);
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(localName);
259460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i < nbval + nbneg -1)
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		str = xmlStrcat(str, BAD_CAST ", ");
259760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str = xmlStrcat(str, BAD_CAST " ).\n");
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST str);
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      msg = xmlStrcat(msg, BAD_CAST "\n");
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetErr(xmlSchemaAbstractCtxtPtr actxt,
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlParserErrors error,
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *value,
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  unsigned long length,
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaTypePtr type,
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaFacetPtr facet,
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const char *message,
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str1,
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *str2)
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeType facetType;
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nodeType = xmlSchemaEvalErrorNodeType(actxt, node);
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, actxt, node);
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error == XML_SCHEMAV_CVC_ENUMERATION_VALID) {
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetType = XML_SCHEMA_FACET_ENUMERATION;
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If enumerations are validated, one must not expect the
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* facet to be given.
262960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
263060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetType = facet->type;
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "[");
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "facet '");
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facetType));
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "'] ");
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message == NULL) {
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use a default message.
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (facetType == XML_SCHEMA_FACET_MINLENGTH) ||
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (facetType == XML_SCHEMA_FACET_MAXLENGTH)) {
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char len[25], actLen[25];
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* FIXME, TODO: What is the max expected string length of the
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * this value?
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nodeType == XML_ATTRIBUTE_NODE)
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value '%s' has a length of '%s'; ");
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value has a length of '%s'; ");
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(len, 24, "%lu", xmlSchemaGetFacetValueAsULong(facet));
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(actLen, 24, "%lu", length);
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facetType == XML_SCHEMA_FACET_LENGTH)
265860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
265960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		BAD_CAST "this differs from the allowed length of '%s'.\n");
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (facetType == XML_SCHEMA_FACET_MAXLENGTH)
266160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST "this exceeds the allowed maximum length of '%s'.\n");
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (facetType == XML_SCHEMA_FACET_MINLENGTH)
266460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		msg = xmlStrcat(msg,
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST "this underruns the allowed minimum length of '%s'.\n");
266660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nodeType == XML_ATTRIBUTE_NODE)
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaErr3(actxt, error, node, (const char *) msg,
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, (const xmlChar *) actLen, (const xmlChar *) len);
267060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    else
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaErr(actxt, error, node, (const char *) msg,
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar *) actLen, (const xmlChar *) len);
267360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_ENUMERATION) {
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not an element "
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"of the set {%s}.\n");
267760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatFacetEnumSet(actxt, &str, type));
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_PATTERN) {
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not accepted "
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"by the pattern '%s'.\n");
268260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MININCLUSIVE) {
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is less than the "
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"minimum value allowed ('%s').\n");
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) {
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is greater than the "
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maximum value allowed ('%s').\n");
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE) {
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be greater than "
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s'.\n");
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) {
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' must be less than "
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s'.\n");
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, value,
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_TOTALDIGITS) {
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more "
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"digits than are allowed ('%s').\n");
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) {
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' has more fractional "
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"digits than are allowed ('%s').\n");
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char*) msg, value,
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->value);
271460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (nodeType == XML_ATTRIBUTE_NODE) {
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not facet-valid.\n");
271660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaErr(actxt, error, node, (const char *) msg, value, NULL);
271760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else {
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "The value is not facet-valid.\n");
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaErr(actxt, error, node, (const char *) msg, NULL, NULL);
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, (const xmlChar *) message);
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ".\n");
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaErr(actxt, error, node, (const char *) msg, str1, str2);
272560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VERROR(err, type, msg) \
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCustomErr(ACTXT_CAST vctxt, err, NULL, type, msg, NULL, NULL);
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST vctxt, func, msg);
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PERROR_INT(func, msg) xmlSchemaInternalErr(ACTXT_CAST pctxt, func, msg);
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define PERROR_INT2(func, msg) xmlSchemaInternalErr(ACTXT_CAST ctxt, func, msg);
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define AERROR_INT(func, msg) xmlSchemaInternalErr(actxt, func, msg);
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPMissingAttrErr:
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of  the owner
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerName: the name of the owner
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner as an element node
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the parent element node of the missing attribute node
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the corresponding type of the attribute node
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute.
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPMissingAttrErr(xmlSchemaParserCtxtPtr ctxt,
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr ownerElem,
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name,
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *message)
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message != NULL)
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem, error, "%s: %s.\n", BAD_CAST des, BAD_CAST message);
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem, error,
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s: The attribute '%s' is required but missing.\n",
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, BAD_CAST name);
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPResCompAttrErr:
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of  the owner
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner as an element node
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute holding the QName
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @refName: the referenced local name
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @refURI: the referenced namespace URI
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: optional message
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Used to report QName attribute values that failed to resolve
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to schema components.
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPResCompAttrErr(xmlSchemaParserCtxtPtr ctxt,
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr ownerElem,
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name,
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *refName,
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *refURI,
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaTypeType refType,
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *refTypeStr)
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *strA = NULL;
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (refTypeStr == NULL)
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refTypeStr = (const char *) xmlSchemaItemTypeToStr(refType);
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, ownerElem, error,
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL,
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': The QName value '%s' does not resolve to a(n) "
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s.\n", BAD_CAST des, BAD_CAST name,
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&strA, refURI, refName),
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST refTypeStr, NULL);
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strA)
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomAttrErr:
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the illegal attribute node
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute during the parse.
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomAttrErr(xmlSchemaParserCtxtPtr ctxt,
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar **ownerDes,
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaBasicItemPtr ownerItem,
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAttrPtr attr,
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *msg)
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownerDes == NULL)
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&des, NULL, ownerItem, attr->parent);
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (*ownerDes == NULL) {
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(ownerDes, NULL, ownerItem, attr->parent);
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	des = *ownerDes;
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	des = *ownerDes;
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, NULL, error, NULL, NULL, NULL,
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': %s.\n",
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, (const xmlChar *) "Unknown",
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const xmlChar *) msg, NULL, NULL);
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s, attribute '%s': %s.\n",
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, attr->name, (const xmlChar *) msg, NULL, NULL);
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownerDes == NULL)
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(des);
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalAttrErr:
2859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the attribute's owner
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the attribute's owner item
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the illegal attribute node
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute during the parse.
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalAttrErr(xmlSchemaParserCtxtPtr ctxt,
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerComp ATTRIBUTE_UNUSED,
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAttrPtr attr)
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *strA = NULL, *strB = NULL;
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&strA, ACTXT_CAST ctxt, attr->parent);
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaErr4(ACTXT_CAST ctxt, error, (xmlNodePtr) attr,
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%sThe attribute '%s' is not allowed.\n", BAD_CAST strA,
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQNameNs(&strB, attr->ns, attr->name),
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL);
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strA);
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strB);
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomErr:
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema item
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: an optional param for the error message
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: an optional param for the error message
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str3: an optional param for the error message
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error during parsing.
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomErrExt(xmlSchemaParserCtxtPtr ctxt,
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr item,
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr itemElem,
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1,
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str2,
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str3)
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *msg = NULL;
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, item, itemElem);
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "%s: ");
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((itemElem == NULL) && (item != NULL))
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	itemElem = WXS_ITEM_NODE(item);
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, itemElem, error, NULL, NULL, NULL,
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, BAD_CAST des, str1, str2, str3, NULL);
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg);
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPCustomErr:
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema item
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: the optional param for the error message
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error during parsing.
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCustomErr(xmlSchemaParserCtxtPtr ctxt,
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr item,
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr itemElem,
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1)
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErrExt(ctxt, error, item, itemElem, message,
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str1, NULL, NULL);
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPAttrUseErr:
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema type
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema type
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemElem: the node of the schema type
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the invalid schema attribute
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the error message
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: the optional param for the error message
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an attribute use error during parsing.
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPAttrUseErr4(xmlSchemaParserCtxtPtr ctxt,
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlParserErrors error,
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node,
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaBasicItemPtr ownerItem,
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlSchemaAttributeUsePtr attruse,
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const char *message,
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str1, const xmlChar *str2,
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *str3,const xmlChar *str4)
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL, *msg = NULL;
297060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&msg, NULL, ownerItem, NULL);
297260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    msg = xmlStrcat(msg, BAD_CAST ", ");
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg,
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFormatItemForReport(&str, NULL,
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST attruse, NULL));
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str);
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ": ");
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, (const xmlChar *) message);
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST ".\n");
298060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaErr4(ACTXT_CAST ctxt, error, node,
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, str1, str2, str3, str4);
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalFacetAtomicErr:
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the schema type
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType: the base type of type
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the illegal facet
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal facet for atomic simple types.
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalFacetAtomicErr(xmlSchemaParserCtxtPtr ctxt,
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlParserErrors error,
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type,
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr baseType,
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaFacetPtr facet)
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL, *strT = NULL;
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type, type->node);
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, type->node, error, NULL, NULL, NULL,
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The facet '%s' is not allowed on types derived from the "
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"type %s.\n",
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type),
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatItemForReport(&strT, NULL, WXS_BASIC_CAST baseType, NULL),
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL);
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(strT);
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPIllegalFacetListUnionErr:
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @itemDes: the designation of the schema item involved
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema item involved
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet: the illegal facet
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal facet for <list> and <union>.
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPIllegalFacetListUnionErr(xmlSchemaParserCtxtPtr ctxt,
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlParserErrors error,
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type,
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaFacetPtr facet)
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST type,
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node);
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErr(ctxt, type->node, error,
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The facet '%s' is not allowed.\n",
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, xmlSchemaFacetTypeToString(facet->type));
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPMutualExclAttrErr:
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDes: the designation of the parent element node
3046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the bad attribute node
3047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the corresponding type of the attribute node
3048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an illegal attribute.
3050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPMutualExclAttrErr(xmlSchemaParserCtxtPtr ctxt,
3053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlParserErrors error,
3054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBasicItemPtr ownerItem,
3055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlAttrPtr attr,
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name1,
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const char *name2)
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, WXS_BASIC_CAST ownerItem, attr->parent);
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPErrExt(ctxt, (xmlNodePtr) attr, error, NULL, NULL, NULL,
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"%s: The attributes '%s' and '%s' are mutually exclusive.\n",
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST des, BAD_CAST name1, BAD_CAST name2, NULL, NULL);
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPSimpleTypeErr:
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type specifier
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner
307460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ownerItem: the schema object if existent
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the validated node
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the validated value
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports a simple type validation error.
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Should this report the value of an element as well?
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
308260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaPSimpleTypeErr(xmlSchemaParserCtxtPtr ctxt,
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlParserErrors error,
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaBasicItemPtr ownerItem ATTRIBUTE_UNUSED,
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node,
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type,
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *expected,
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *value,
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const char *message,
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *str1,
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *str2)
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
309460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatNodeForError(&msg, ACTXT_CAST ctxt, node);
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message == NULL) {
3097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use default messages.
309960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
3100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type != NULL) {
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->type == XML_ATTRIBUTE_NODE)
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "'%s' is not a valid value of ");
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The character content is not a "
310560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		"valid value of ");
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! xmlSchemaIsGlobalItem(type))
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "the local ");
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "the ");
311060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_ATOMIC(type))
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "atomic type");
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_LIST(type))
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "list type");
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (WXS_IS_UNION(type))
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "union type");
311760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaIsGlobalItem(type)) {
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST " '");
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->builtInType != 0) {
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg, BAD_CAST "xs:");
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg, type->name);
312460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    msg = xmlStrcat(msg,
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    type->targetNamespace, type->name));
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "'.");
3129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
3130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->type == XML_ATTRIBUTE_NODE)
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The value '%s' is not valid.");
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		msg = xmlStrcat(msg, BAD_CAST "The character content is not "
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"valid.");
313760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (expected) {
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST " Expected is '");
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST expected);
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "'.\n");
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = xmlStrcat(msg, BAD_CAST "\n");
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ATTRIBUTE_NODE)
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, value, NULL);
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, node, error, (const char *) msg, NULL, NULL);
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST message);
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST ".\n");
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrExt(ctxt, node, error, NULL, NULL, NULL,
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (const char*) msg, str1, str2, NULL, NULL, NULL);
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
315460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Cleanup. */
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(msg)
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPContentErr:
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @onwerDes: the designation of the holder of the content
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner item of the holder of the content
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the node of the holder of the content
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child: the invalid child node
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @message: the optional error message
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content: the optional string describing the correct content
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Reports an error concerning the content of a schema element.
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPContentErr(xmlSchemaParserCtxtPtr ctxt,
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlParserErrors error,
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBasicItemPtr ownerItem,
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr ownerElem,
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr child,
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *message,
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const char *content)
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFormatItemForReport(&des, NULL, ownerItem, ownerElem);
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (message != NULL)
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr2(ctxt, ownerElem, child, error,
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "%s: %s.\n",
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    BAD_CAST des, BAD_CAST message);
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (content != NULL) {
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"%s: The content is not valid. Expected is %s.\n",
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST des, BAD_CAST content);
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr2(ctxt, ownerElem, child, error,
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"%s: The content is not valid.\n",
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST des, NULL);
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Streamable error functions                      *
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Validation helper functions			*
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Allocation functions				*
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewSchemaForParserCtxt:
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Schema structure.
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPtr
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewSchema(xmlSchemaParserCtxtPtr ctxt)
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr ret;
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaPtr) xmlMalloc(sizeof(xmlSchema));
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating schema", NULL);
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchema));
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = ctxt->dict;
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictReference(ret->dict);
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewFacet:
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Facet structure.
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetPtr
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewFacet(void)
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr ret;
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaFacetPtr) xmlMalloc(sizeof(xmlSchemaFacet));
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaFacet));
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewAnnot:
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a node
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new annotation structure.
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewAnnot(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr ret;
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAnnotPtr) xmlMalloc(sizeof(xmlSchemaAnnot));
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating annotation", node);
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAnnot));
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->content = node;
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaItemListPtr
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListCreate(void)
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr ret;
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlMalloc(sizeof(xmlSchemaItemList));
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating an item list structure", NULL);
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaItemList));
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListClear(xmlSchemaItemListPtr list)
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL) {
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = NULL;
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->nbItems = 0;
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->sizeItems = 0;
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListAdd(xmlSchemaItemListPtr list, void *item)
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    20 * sizeof(void *));
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 20;
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->nbItems++] = item;
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListAddSize(xmlSchemaItemListPtr list,
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int initialSize,
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 void *item)
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = initialSize;
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list->items[list->nbItems++] = item;
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListInsert(xmlSchemaItemListPtr list, void *item, int idx)
337560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    20 * sizeof(void *));
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 20;
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Just append if the index is greater/equal than the item count.
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idx >= list->nbItems) {
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[list->nbItems++] = item;
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = list->nbItems; i > idx; i--)
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i-1];
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[idx] = item;
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems++;
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* enable if ever needed */
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListInsertSize(xmlSchemaItemListPtr list,
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int initialSize,
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    void *item,
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int idx)
341560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items == NULL) {
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (initialSize <= 0)
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize = 1;
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlMalloc(
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    initialSize * sizeof(void *));
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "allocating new item list", NULL);
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = initialSize;
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->sizeItems <= list->nbItems) {
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems *= 2;
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = (void **) xmlRealloc(list->items,
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems * sizeof(void *));
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (list->items == NULL) {
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "growing item list", NULL);
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->sizeItems = 0;
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Just append if the index is greater/equal than the item count.
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idx >= list->nbItems) {
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[list->nbItems++] = item;
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = list->nbItems; i > idx; i--)
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i-1];
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items[idx] = item;
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems++;
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListRemove(xmlSchemaItemListPtr list, int idx)
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((list->items == NULL) || (idx >= list->nbItems)) {
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleErr("Internal error: xmlSchemaItemListRemove, "
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "index error.\n");
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 1) {
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Really free the list? */
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->items = NULL;
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems = 0;
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->sizeItems = 0;
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (list->nbItems -1 == idx) {
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems--;
347060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = idx; i < list->nbItems -1; i++)
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = list->items[i+1];
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems--;
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaItemListFree:
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a schema type structure
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a annotation structure
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaItemListFree(xmlSchemaItemListPtr list)
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL)
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->items != NULL)
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(list->items);
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBucketFree(xmlSchemaBucketPtr bucket)
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->globals != NULL) {
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaComponentListFree(bucket->globals);
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(bucket->globals);
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->locals != NULL) {
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaComponentListFree(bucket->locals);
350560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaItemListFree(bucket->locals);
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr prev, cur = bucket->relations;
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
351060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    prev = cur;
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! bucket->preserveDoc) && (bucket->doc != NULL)) {
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(bucket->doc);
351760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->type == XML_SCHEMA_SCHEMA_IMPORT) {
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IMPBUCKET(bucket)->schema != NULL)
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(WXS_IMPBUCKET(bucket)->schema);
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(bucket);
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBucketCreate(xmlSchemaParserCtxtPtr pctxt,
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int type, const xmlChar *targetNamespace)
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr ret;
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr mainSchema;
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->mainSchema == NULL) {
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaBucketCreate",
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no main schema on constructor");
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema = WXS_CONSTRUCTOR(pctxt)->mainSchema;
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the schema bucket. */
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_INCREDEF(type))
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = sizeof(xmlSchemaInclude);
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	size = sizeof(xmlSchemaImport);
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaBucketPtr) xmlMalloc(size);
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL, "allocating schema bucket", NULL);
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, size);
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = targetNamespace;
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->globals = xmlSchemaItemListCreate();
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->globals == NULL) {
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->locals = xmlSchemaItemListCreate();
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->locals == NULL) {
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
356260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The following will assure that only the first bucket is marked as
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMA_SCHEMA_MAIN and it points to the *main* schema.
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For each following import buckets an xmlSchema will be created.
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * An xmlSchema will be created for every distinct targetNamespace.
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We assign the targetNamespace to the schemata here.
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_HAS_BUCKETS(pctxt)) {
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_INCREDEF(type)) {
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"first bucket but it's an include or redefine");
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
357660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* Force the type to be XML_SCHEMA_SCHEMA_MAIN. */
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->type = XML_SCHEMA_SCHEMA_MAIN;
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Point to the *main* schema. */
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->mainBucket = ret;
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_IMPBUCKET(ret)->schema = mainSchema;
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Ensure that the main schema gets a targetNamespace.
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mainSchema->targetNamespace = targetNamespace;
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
358660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (type == XML_SCHEMA_SCHEMA_MAIN) {
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"main bucket but it's not the first one");
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
359160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (type == XML_SCHEMA_SCHEMA_IMPORT) {
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create a schema for imports and assign the
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * targetNamespace.
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IMPBUCKET(ret)->schema = xmlSchemaNewSchema(pctxt);
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IMPBUCKET(ret)->schema == NULL) {
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IMPBUCKET(ret)->schema->targetNamespace = targetNamespace;
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
360360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int res;
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Imports go into the "schemasImports" slot of the main *schema*.
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we create an import entry for the main schema as well; i.e.,
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* even if there's only one schema, we'll get an import.
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema->schemasImports == NULL) {
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema->schemasImports = xmlHashCreateDict(5,
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_CONSTRUCTOR(pctxt)->dict);
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (mainSchema->schemasImports == NULL) {
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (targetNamespace == NULL)
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlHashAddEntry(mainSchema->schemasImports,
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_NO_NAMESPACE, ret);
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlHashAddEntry(mainSchema->schemasImports,
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		targetNamespace, ret);
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaBucketCreate",
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to add the schema bucket to the hash");
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaBucketFree(ret);
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Set the @ownerImport of an include bucket. */
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_IMPMAIN(WXS_CONSTRUCTOR(pctxt)->bucket->type))
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_INCBUCKET(ret)->ownerImport =
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_IMPBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket);
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_INCBUCKET(ret)->ownerImport =
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_INCBUCKET(WXS_CONSTRUCTOR(pctxt)->bucket)->ownerImport;
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Includes got into the "includes" slot of the *main* schema. */
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema->includes == NULL) {
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema->includes = xmlSchemaItemListCreate();
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (mainSchema->includes == NULL) {
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketFree(ret);
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
364660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListAdd(mainSchema->includes, ret);
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
365060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to list of all buckets; this is used for lookup
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * during schema construction time only.
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaItemListAdd(WXS_CONSTRUCTOR(pctxt)->buckets, ret) == -1)
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddItemSize(xmlSchemaItemListPtr *list, int initialSize, void *item)
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*list == NULL) {
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*list = xmlSchemaItemListCreate();
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*list == NULL)
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAddSize(*list, initialSize, item);
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAnnot:
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a schema type structure
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a annotation structure
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAnnot(xmlSchemaAnnotPtr annot)
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot == NULL)
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot->next == NULL) {
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(annot);
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAnnotPtr prev;
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = annot;
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = annot->next;
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (annot != NULL);
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeNotation:
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema notation structure
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Notation structure.
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeNotation(xmlSchemaNotationPtr nota)
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nota == NULL)
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(nota);
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttribute:
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  an attribute declaration
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute declaration structure.
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttribute(xmlSchemaAttributePtr attr)
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->annot != NULL)
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(attr->annot);
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->defVal != NULL)
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(attr->defVal);
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(attr);
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeUse:
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @use:  an attribute use
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute use structure.
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeUse(xmlSchemaAttributeUsePtr use)
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use == NULL)
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use->annot != NULL)
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(use->annot);
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (use->defVal != NULL)
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(use->defVal);
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(use);
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeUseProhib:
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prohib:  an attribute use prohibition
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an attribute use structure.
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeUseProhib(xmlSchemaAttributeUseProhibPtr prohib)
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohib == NULL)
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(prohib);
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeWildcardNsSet:
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * set:  a schema wildcard namespace
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a list of wildcard constraint structures.
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeWildcardNsSet(xmlSchemaWildcardNsPtr set)
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr next;
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (set != NULL) {
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = set->next;
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(set);
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set = next;
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeWildcard:
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wildcard:  a wildcard structure
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a wildcard structure.
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeWildcard(xmlSchemaWildcardPtr wildcard)
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard == NULL)
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->annot != NULL)
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(wildcard->annot);
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->nsSet != NULL)
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeWildcardNsSet(wildcard->nsSet);
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wildcard->negNsSet != NULL)
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(wildcard->negNsSet);
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(wildcard);
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeAttributeGroup:
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema attribute group structure
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Attribute Group structure.
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeAttributeGroup(xmlSchemaAttributeGroupPtr attrGr)
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr == NULL)
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->annot != NULL)
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(attrGr->annot);
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->attrUses != NULL)
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(WXS_LIST_CAST attrGr->attrUses);
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(attrGr);
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeQNameRef:
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: a QName reference structure
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocatea a QName reference structure.
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeQNameRef(xmlSchemaQNameRefPtr item)
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeTypeLinkList:
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @alink: a type link
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a list of types.
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeTypeLinkList(xmlSchemaTypeLinkPtr link)
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr next;
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = link->next;
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(link);
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = next;
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeIDCStateObjList(xmlSchemaIDCStateObjPtr sto)
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr next;
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != NULL) {
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = sto->next;
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->history != NULL)
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(sto->history);
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->xpathCtxt != NULL)
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(sto);
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = next;
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeIDC:
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idc: a identity-constraint definition
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates an identity-constraint definition.
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeIDC(xmlSchemaIDCPtr idcDef)
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr cur, prev;
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef == NULL)
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->annot != NULL)
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(idcDef->annot);
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Selector */
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->selector != NULL) {
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (idcDef->selector->xpathComp != NULL)
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFreePattern((xmlPatternPtr) idcDef->selector->xpathComp);
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(idcDef->selector);
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Fields */
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcDef->fields != NULL) {
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = idcDef->fields;
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prev->xpathComp != NULL)
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFreePattern((xmlPatternPtr) prev->xpathComp);
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prev);
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(idcDef);
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeElement:
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema element structure
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Element structure.
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeElement(xmlSchemaElementPtr elem)
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem == NULL)
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->annot != NULL)
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(elem->annot);
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->contModel != NULL)
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(elem->contModel);
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->defVal != NULL)
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(elem->defVal);
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(elem);
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeFacet:
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  a schema facet structure
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Facet structure.
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeFacet(xmlSchemaFacetPtr facet)
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->val != NULL)
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(facet->val);
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->regexp != NULL)
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(facet->regexp);
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet->annot != NULL)
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(facet->annot);
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(facet);
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeType:
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  a schema type structure
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema Type structure.
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeType(xmlSchemaTypePtr type)
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->annot != NULL)
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(type->annot);
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facets != NULL) {
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFacetPtr facet, next;
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet = type->facets;
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (facet != NULL) {
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            next = facet->next;
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlSchemaFreeFacet(facet);
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            facet = next;
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses != NULL)
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree((xmlSchemaItemListPtr) type->attrUses);
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->memberTypes != NULL)
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeTypeLinkList(type->memberTypes);
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet != NULL) {
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetLinkPtr next, link;
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = type->facetSet;
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = link->next;
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(link);
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = next;
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (link != NULL);
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contModel != NULL)
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(type->contModel);
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(type);
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeModelGroupDef:
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  a schema model group definition
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a schema model group definition.
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeModelGroupDef(xmlSchemaModelGroupDefPtr item)
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot != NULL)
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(item->annot);
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeModelGroup:
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  a schema model group
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocates a schema model group structure.
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeModelGroup(xmlSchemaModelGroupPtr item)
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot != NULL)
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(item->annot);
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(item);
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaComponentListFree(xmlSchemaItemListPtr list)
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((list == NULL) || (list->nbItems == 0))
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr item;
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr *items = (xmlSchemaTreeItemPtr *) list->items;
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = items[i];
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item == NULL)
401860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (item->type) {
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SIMPLE:
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_COMPLEX:
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeType((xmlSchemaTypePtr) item);
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTE:
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttribute((xmlSchemaAttributePtr) item);
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeUse((xmlSchemaAttributeUsePtr) item);
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeUseProhib(
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaAttributeUseProhibPtr) item);
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ELEMENT:
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeElement((xmlSchemaElementPtr) item);
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_PARTICLE:
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (item->annot != NULL)
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFreeAnnot(item->annot);
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(item);
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SEQUENCE:
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_CHOICE:
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ALL:
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeModelGroup((xmlSchemaModelGroupPtr) item);
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeAttributeGroup(
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaAttributeGroupPtr) item);
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_GROUP:
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeModelGroupDef(
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaModelGroupDefPtr) item);
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ANY:
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) item);
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_KEY:
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_UNIQUE:
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_IDC_KEYREF:
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeIDC((xmlSchemaIDCPtr) item);
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_NOTATION:
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeNotation((xmlSchemaNotationPtr) item);
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_EXTRA_QNAMEREF:
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeQNameRef((xmlSchemaQNameRefPtr) item);
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default: {
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: This should never be hit. */
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleInternalErr(NULL,
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Internal error: xmlSchemaComponentListFree, "
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"unexpected component type '%s'\n",
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) WXS_ITEM_TYPE_NAME(item));
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 }
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	list->nbItems = 0;
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFree:
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schema structure.
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFree(xmlSchemaPtr schema)
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* @volatiles is not used anymore :-/ */
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->volatiles != NULL)
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that those slots are not responsible for freeing
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schema components anymore; this will now be done by
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the schema buckets.
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->notaDecl != NULL)
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->notaDecl, NULL);
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->attrDecl != NULL)
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->attrDecl, NULL);
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->attrgrpDecl != NULL)
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->attrgrpDecl, NULL);
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->elemDecl != NULL)
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->elemDecl, NULL);
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->typeDecl != NULL)
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->typeDecl, NULL);
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->groupDecl != NULL)
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->groupDecl, NULL);
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->idcDef != NULL)
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(schema->idcDef, NULL);
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->schemasImports != NULL)
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(schema->schemasImports,
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlHashDeallocator) xmlSchemaBucketFree);
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->includes != NULL) {
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr list = (xmlSchemaItemListPtr) schema->includes;
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
412560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaBucketFree((xmlSchemaBucketPtr) list->items[i]);
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(list);
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->annot != NULL)
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeAnnot(schema->annot);
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Never free the doc here, since this will be done by the buckets. */
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(schema->dict);
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Debug functions					*
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output); /* forward */
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaElementDump:
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the element
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaElementDump(xmlSchemaElementPtr elem, FILE * output,
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar * name ATTRIBUTE_UNUSED,
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar * namespace ATTRIBUTE_UNUSED,
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar * context ATTRIBUTE_UNUSED)
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem == NULL)
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Element");
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->flags & XML_SCHEMAS_ELEM_GLOBAL)
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " (global)");
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, ": '%s' ", elem->name);
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespace != NULL)
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "ns '%s'", namespace);
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elem->minOccurs != 1) || (elem->maxOccurs != 1)) {
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  min %d ", elem->minOccurs);
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (elem->maxOccurs >= UNBOUNDED)
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "max: unbounded\n");
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (elem->maxOccurs != 1)
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "max: %d\n", elem->maxOccurs);
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "\n");
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Misc other properties.
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elem->flags & XML_SCHEMAS_ELEM_NILLABLE) ||
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_ABSTRACT) ||
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_FIXED) ||
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elem->flags & XML_SCHEMAS_ELEM_DEFAULT)) {
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  props: ");
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_FIXED)
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[fixed] ");
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_DEFAULT)
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[default] ");
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_ABSTRACT)
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[abstract] ");
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->flags & XML_SCHEMAS_ELEM_NILLABLE)
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "[nillable] ");
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "\n");
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Default/fixed value.
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->value != NULL)
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  value: '%s'\n", elem->value);
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Type.
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->namedType != NULL) {
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  type: '%s' ", elem->namedType);
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->namedTypeNs != NULL)
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ns '%s'\n", elem->namedTypeNs);
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (elem->subtypes != NULL) {
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Dump local types.
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeDump(elem->subtypes, output);
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Substitution group.
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->substGroup != NULL) {
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "  substitutionGroup: '%s' ", elem->substGroup);
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elem->substGroupNs != NULL)
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "ns '%s'\n", elem->substGroupNs);
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAnnotDump:
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot:  a annotation
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the annotation
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAnnotDump(FILE * output, xmlSchemaAnnotPtr annot)
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *content;
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot == NULL)
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    content = xmlNodeGetContent(annot->content);
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (content != NULL) {
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  Annot: %s\n", content);
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(content);
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  Annot: empty\n");
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaContentModelDump:
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the schema particle
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output: the file output
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the depth used for intentation
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a SchemaType structure
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaContentModelDump(xmlSchemaParticlePtr particle, FILE * output, int depth)
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr term;
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char shift[100];
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;((i < depth) && (i < 25));i++)
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        shift[2 * i] = shift[2 * i + 1] = ' ';
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    shift[2 * i] = shift[2 * i + 1] = 0;
427743ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich    fprintf(output, "%s", shift);
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children == NULL) {
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "MISSING particle term\n");
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    term = particle->children;
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (term == NULL) {
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "(NULL)");
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (term->type) {
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ELEM '%s'", xmlSchemaFormatQName(&str,
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaElementPtr)term)->targetNamespace,
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((xmlSchemaElementPtr)term)->name));
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "SEQUENCE");
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "CHOICE");
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ALL");
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ANY:
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "ANY");
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "UNKNOWN\n");
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->minOccurs != 1)
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " min: %d", particle->minOccurs);
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->maxOccurs >= UNBOUNDED)
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " max: unbounded");
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (particle->maxOccurs != 1)
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, " max: %d", particle->maxOccurs);
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (term &&
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((term->type == XML_SCHEMA_TYPE_SEQUENCE) ||
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->type == XML_SCHEMA_TYPE_CHOICE) ||
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->type == XML_SCHEMA_TYPE_ALL)) &&
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (term->children != NULL)) {
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) term->children,
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    output, depth +1);
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->next != NULL)
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) particle->next,
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		output, depth);
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttrUsesDump:
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uses:  attribute uses list
433360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @output:  the file output
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dumps a list of attribute use components.
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttrUsesDump(xmlSchemaItemListPtr uses, FILE * output)
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr use;
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUseProhibPtr prohib;
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref;
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name, *tns;
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((uses == NULL) || (uses->nbItems == 0))
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
435060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    fprintf(output, "  attributes:\n");
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < uses->nbItems; i++) {
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = uses->items[i];
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [prohibition] ");
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prohib = (xmlSchemaAttributeUseProhibPtr) use;
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = prohib->name;
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = prohib->targetNamespace;
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (use->type == XML_SCHEMA_EXTRA_QNAMEREF) {
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [reference] ");
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref = (xmlSchemaQNameRefPtr) use;
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = ref->name;
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = ref->targetNamespace;
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "  [use] ");
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name = WXS_ATTRUSE_DECL_NAME(use);
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tns = WXS_ATTRUSE_DECL_TNS(use);
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "'%s'\n",
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const char *) xmlSchemaFormatQName(&str, tns, name));
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str);
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeDump:
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  a type structure
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a SchemaType structure
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeDump(xmlSchemaTypePtr type, FILE * output)
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL) {
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Type: NULL\n");
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Type: ");
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->name != NULL)
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "'%s' ", type->name);
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "(no name) ");
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->targetNamespace != NULL)
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "ns '%s' ", type->targetNamespace);
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->type) {
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_BASIC:
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[basic] ");
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SIMPLE:
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[simple] ");
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_COMPLEX:
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[complex] ");
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SEQUENCE:
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[sequence] ");
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_CHOICE:
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[choice] ");
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_ALL:
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[all] ");
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_UR:
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[ur] ");
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_RESTRICTION:
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[restriction] ");
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_EXTENSION:
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[extension] ");
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[unknown type %d] ", type->type);
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "content: ");
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->contentType) {
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_UNKNOWN:
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[unknown] ");
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_EMPTY:
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[empty] ");
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ELEMENTS:
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[element] ");
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_MIXED:
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[mixed] ");
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* not used. */
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_BASIC:
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[basic] ");
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_SIMPLE:
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[simple] ");
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ANY:
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "[any] ");
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->base != NULL) {
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "  base type: '%s'", type->base);
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseNs != NULL)
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, " ns '%s'\n", type->baseNs);
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "\n");
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses != NULL)
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrUsesDump(type->attrUses, output);
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->annot != NULL)
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaAnnotDump(output, type->annot);
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DUMP_CONTENT_MODEL
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->type == XML_SCHEMA_TYPE_COMPLEX) &&
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->subtypes != NULL)) {
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaContentModelDump((xmlSchemaParticlePtr) type->subtypes,
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    output, 1);
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDump:
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a Schema structure.
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDump(FILE * output, xmlSchemaPtr schema)
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "Schemas: NULL\n");
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "Schemas: ");
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->name != NULL)
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s, ", schema->name);
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no name, ");
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->targetNamespace != NULL)
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s", (const char *) schema->targetNamespace);
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no target namespace");
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "\n");
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->annot != NULL)
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaAnnotDump(output, schema->annot);
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScan(schema->typeDecl, (xmlHashScanner) xmlSchemaTypeDump,
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                output);
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScanFull(schema->elemDecl,
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlHashScannerFull) xmlSchemaElementDump, output);
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC_NODE_TABLE
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaDebugDumpIDCTable:
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Displays the current IDC table for debug purposes.
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDebugDumpIDCTable(FILE * output,
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *namespaceName,
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *localName,
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaPSVIIDCBindingPtr bind)
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr tab;
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr key;
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, res;
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "IDC: TABLES on '%s'\n",
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFormatQName(&str, namespaceName, localName));
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(str)
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind == NULL)
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fprintf(output, "IDC:   BINDING '%s' (%d)\n",
453660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaGetComponentQName(&str,
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind->definition), bind->nbNodes);
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < bind->nbNodes; i++) {
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tab = bind->nodeTable[i];
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "         ( ");
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < bind->definition->nbFields; j++) {
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		key = tab->keys[j];
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((key != NULL) && (key->val != NULL)) {
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    res = xmlSchemaGetCanonValue(key->val, &value);
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res >= 0)
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(output, "'%s' ", value);
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			fprintf(output, "CANON-VALUE-FAILED ");
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res == 0)
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(value)
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (key != NULL)
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(no val), ");
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(key missing), ");
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, ")\n");
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->dupls && bind->dupls->nbItems) {
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fprintf(output, "IDC:     dupls (%d):\n", bind->dupls->nbItems);
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < bind->dupls->nbItems; i++) {
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tab = bind->dupls->items[i];
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, "         ( ");
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 0; j < bind->definition->nbFields; j++) {
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key = tab->keys[j];
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((key != NULL) && (key->val != NULL)) {
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			res = xmlSchemaGetCanonValue(key->val, &value);
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res >= 0)
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "'%s' ", value);
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "CANON-VALUE-FAILED ");
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == 0)
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(value)
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (key != NULL)
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    fprintf(output, "(no val), ");
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    fprintf(output, "(key missing), ");
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fprintf(output, ")\n");
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (bind != NULL);
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* DEBUG_IDC */
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Utilities					*
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPropNode:
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Seeks an attribute with a name of @name in
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * no namespace.
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute or NULL if not present.
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlAttrPtr
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPropNode(xmlNodePtr node, const char *name)
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop;
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (name == NULL))
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    prop = node->properties;
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (prop != NULL) {
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((prop->ns == NULL) && xmlStrEqual(prop->name, BAD_CAST name))
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(prop);
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prop = prop->next;
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPropNodeNs:
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri: the uri
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the name of the attribute
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Seeks an attribute with a local name of @name and
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a namespace URI of @uri.
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute or NULL if not present.
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlAttrPtr
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPropNodeNs(xmlNodePtr node, const char *uri, const char *name)
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop;
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (name == NULL))
463760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(NULL);
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    prop = node->properties;
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (prop != NULL) {
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((prop->ns != NULL) &&
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(prop->name, BAD_CAST name) &&
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(prop->ns->href, BAD_CAST uri))
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(prop);
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prop = prop->next;
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNodeContent(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node)
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ret;
4654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlNodeGetContent(node);
4656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlStrdup((xmlChar *)"");
4658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlDictLookup(ctxt->dict, val, -1);
4659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(val);
4660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNodeContentNoDict(xmlNodePtr node)
4665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((const xmlChar*) xmlNodeGetContent(node));
4667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetProp:
4671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
4672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node
4673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the property name
4674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read a attribute value and internalize the string
4676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the string or NULL if not present.
4678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
4680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetProp(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
4681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const char *name)
4682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
4684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ret;
4685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlGetNoNsProp(node, BAD_CAST name);
4687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
4688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
4689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlDictLookup(ctxt->dict, val, -1);
4690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(val);
4691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
4692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Parsing functions				*
4697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_FIND_GLOBAL_ITEM(slot)			\
4701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(nsName, schema->targetNamespace)) { \
4702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlHashLookup(schema->slot, name); \
4703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL) goto exit; \
4704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } \
4705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashSize(schema->schemasImports) > 1) { \
4706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaImportPtr import; \
4707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName == NULL) \
4708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    import = xmlHashLookup(schema->schemasImports, \
4709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_NO_NAMESPACE); \
4710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else \
4711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    import = xmlHashLookup(schema->schemasImports, nsName); \
4712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (import == NULL) \
4713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit; \
4714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlHashLookup(import->schema->slot, name); \
4715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetElem:
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema context
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the element name
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the element namespace
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a global element declaration in the schema.
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element declaration or NULL if not found.
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetElem(xmlSchemaPtr schema, const xmlChar * name,
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret = NULL;
473260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(elemDecl)
473760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup element decl. %s", name);
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup element decl. %s:%s", name,
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetType:
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the main schema
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the type's name
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nsName:  the type's namespace
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a type in the schemas or the predefined types
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetType(xmlSchemaPtr schema, const xmlChar * name,
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ret = NULL;
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
476860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* First try the built-in types. */
477060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((nsName != NULL) && xmlStrEqual(nsName, xmlSchemaNs)) {
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaGetPredefinedType(name, nsName);
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != NULL)
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we try the parsed schemas as well here
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* since one might have parsed the S4S, which contain more
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* than the built-in types.
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Can we optimize this?
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(typeDecl)
478360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup type %s", name);
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup type %s:%s", name,
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetAttributeDecl:
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the attribute
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a an attribute in the schema or imported schemas
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute declaration or NULL if not found.
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetAttributeDecl(xmlSchemaPtr schema, const xmlChar * name,
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret = NULL;
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(attrDecl)
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute %s", name);
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute %s:%s", name,
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetAttributeGroup:
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute group
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the attribute group
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a an attribute group in the schema or imported schemas
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group definition or NULL if not found.
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetAttributeGroup(xmlSchemaPtr schema, const xmlChar * name,
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret = NULL;
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(attrgrpDecl)
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != NULL) && (ret->redef != NULL)) {
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Return the last redefinition. *
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ret->redef;
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute group %s", name);
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup attribute group %s:%s", name,
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetGroup:
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the context of the schema
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the group
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the group
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a group in the schema or imported schemas
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetGroup(xmlSchemaPtr schema, const xmlChar * name,
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * nsName)
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr ret = NULL;
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(groupDecl)
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
489460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nsName == NULL)
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup group %s", name);
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "Unable to lookup group %s:%s", name,
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nsName);
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNotation(xmlSchemaPtr schema,
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *name,
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *nsName)
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret = NULL;
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(notaDecl)
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetIDC(xmlSchemaPtr schema,
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *name,
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *nsName)
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr ret = NULL;
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((name == NULL) || (schema == NULL))
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL) {
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_FIND_GLOBAL_ITEM(idcDef)
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetNamedComponent:
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the group
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the target namespace of the group
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Lookup a group in the schema or imported schemas
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the group definition or NULL if not found.
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetNamedComponent(xmlSchemaPtr schema,
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypeType itemType,
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *name,
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *targetNs)
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (itemType) {
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetGroup(schema,
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, targetNs));
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT:
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return ((xmlSchemaBasicItemPtr) xmlSchemaGetElem(schema,
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, targetNs));
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Parsing functions				*
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n)						\
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((n)->type == XML_TEXT_NODE) && (xmlSchemaIsBlank((n)->content, -1)))
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsBlank:
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a string
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len: the length of the string or -1
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsBlank(xmlChar * str, int len)
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) {
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (*str != 0) {
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!(IS_BLANK_CH(*str)))
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    str++;
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else while ((*str != 0) && (len != 0)) {
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!(IS_BLANK_CH(*str)))
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	str++;
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	len--;
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
500360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_COMP_NAME(c, t) ((t) (c))->name
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_COMP_TNS(c, t) ((t) (c))->targetNamespace
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaFindRedefCompInGraph:
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* ATTENTION TODO: This uses pointer comp. for strings.
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFindRedefCompInGraph(xmlSchemaBucketPtr bucket,
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaTypeType type,
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *name,
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *nsName)
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr ret;
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (name == NULL))
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket->globals == NULL) ||
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(bucket->globals->nbItems == 0))
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto subschemas;
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Search in global components.
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < bucket->globals->nbItems; i++) {
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = bucket->globals->items[i];
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->type == type) {
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (type) {
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_COMPLEX:
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_SIMPLE:
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret, xmlSchemaTypePtr) == name) &&
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret, xmlSchemaTypePtr) ==
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName))
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_GROUP:
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret,
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaModelGroupDefPtr) == name) &&
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret,
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaModelGroupDefPtr) == nsName))
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_COMP_NAME(ret,
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAttributeGroupPtr) == name) &&
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_COMP_TNS(ret,
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaAttributeGroupPtr) == nsName))
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Should not be hit. */
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
506460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectsubschemas:
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process imported/included schemas.
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel = bucket->relations;
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Marking the bucket will not avoid multiple searches
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* in the same schema, but avoids at least circularity.
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bucket->flags |= XML_SCHEMA_BUCKET_MARKED;
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((rel->bucket != NULL) &&
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((rel->bucket->flags & XML_SCHEMA_BUCKET_MARKED) == 0)) {
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaFindRedefCompInGraph(rel->bucket,
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type, name, nsName);
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != NULL)
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(ret);
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 bucket->flags ^= XML_SCHEMA_BUCKET_MARKED;
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddNotation:
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema annotation declaration
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const xmlChar *name, const xmlChar *nsName,
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr node ATTRIBUTE_UNUSED)
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret = NULL;
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaNotationPtr) xmlMalloc(sizeof(xmlSchemaNotation));
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "add annotation", NULL);
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaNotation));
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_NOTATION;
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: do we need the node to be set?
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * ret->node = node;*/
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttribute:
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute declaration
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttribute(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const xmlChar * name, const xmlChar * nsName,
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlNodePtr node, int topLevel)
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret = NULL;
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributePtr) xmlMalloc(sizeof(xmlSchemaAttribute));
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating attribute", NULL);
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttribute));
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE;
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttributeUse:
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute declaration
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeUsePtr
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeUse(xmlSchemaParserCtxtPtr pctxt,
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node)
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr ret = NULL;
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeUsePtr) xmlMalloc(sizeof(xmlSchemaAttributeUse));
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(pctxt, "allocating attribute", NULL);
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeUse));
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTE_USE;
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaAddRedef:
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Adds a redefinition information. This is used at a later stage to:
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* resolve references to the redefined components and to check constraints.
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaRedefPtr
521260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaAddRedef(xmlSchemaParserCtxtPtr pctxt,
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaBucketPtr targetBucket,
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  void *item,
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *refName,
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *refTargetNs)
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr ret;
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaRedefPtr)
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaRedef));
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating redefinition info", NULL);
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaRedef));
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->item = item;
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetBucket = targetBucket;
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->refName = refName;
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->refTargetNs = refTargetNs;
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->redefs == NULL)
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->redefs = ret;
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->lastRedef->next = ret;
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->lastRedef = ret;
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddAttributeGroupDefinition:
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nsName:  the target namespace
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the corresponding node
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Attrribute Group definition.
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema ATTRIBUTE_UNUSED,
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *name,
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *nsName,
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret = NULL;
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (name == NULL))
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeGroupPtr)
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlSchemaAttributeGroup));
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt, "allocating attribute group", NULL);
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeGroup));
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ATTRIBUTEGROUP;
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
527560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Remove the flag. */
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->flags |= XML_SCHEMAS_ATTRGROUP_GLOBAL;
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->isRedefine) {
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redef = xmlSchemaAddRedef(pctxt, pctxt->redefined,
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, name, nsName);
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->redef == NULL) {
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
528560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefCounter = 0;
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(pctxt, ret);
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(pctxt, ret);
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddElement:
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the type name
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the type namespace
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Element declaration
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddElement(xmlSchemaParserCtxtPtr ctxt,
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    const xmlChar * name, const xmlChar * nsName,
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr node, int topLevel)
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret = NULL;
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (name == NULL))
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaElementPtr) xmlMalloc(sizeof(xmlSchemaElement));
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating element", NULL);
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaElement));
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_ELEMENT;
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddType:
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the item name
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the namespace
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema item
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlSchemaTypeType type,
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 const xmlChar * name, const xmlChar * nsName,
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlNodePtr node, int topLevel)
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ret = NULL;
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating type", NULL);
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaType));
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->isRedefine) {
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret, name, nsName);
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->redef == NULL) {
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(ret);
5373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(NULL);
537460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->redefCounter = 0;
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_GLOBAL(ctxt, ret);
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_LOCAL(ctxt, ret);
538060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    WXS_ADD_PENDING(ctxt, ret);
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewQNameRef(xmlSchemaParserCtxtPtr pctxt,
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaTypeType refType,
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *refName,
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     const xmlChar *refNs)
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ret;
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaQNameRefPtr)
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaQNameRef));
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating QName reference item", NULL);
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = NULL;
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_EXTRA_QNAMEREF;
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = refName;
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = refNs;
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->item = NULL;
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->itemType = refType;
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Store the reference item in the schema.
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeUseProhibPtr
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAttributeUseProhib(xmlSchemaParserCtxtPtr pctxt)
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUseProhibPtr ret;
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaAttributeUseProhibPtr)
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaAttributeUseProhib));
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(pctxt,
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating attribute use prohibition", NULL);
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaAttributeUseProhib));
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_EXTRA_ATTR_USE_PROHIB;
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(pctxt, ret);
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddModelGroup:
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the "compositor" type of the model group
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node in the schema doc
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds a schema model group
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupPtr
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddModelGroup(xmlSchemaParserCtxtPtr ctxt,
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaPtr schema,
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypeType type,
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr node)
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr ret = NULL;
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaModelGroupPtr)
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaModelGroup));
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "allocating model group component",
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaModelGroup));
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == XML_SCHEMA_TYPE_SEQUENCE) ||
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type == XML_SCHEMA_TYPE_CHOICE))
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, ret);
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddParticle:
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the corresponding node in the schema doc
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @min: the minOccurs
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @max: the maxOccurs
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds an XML schema particle component.
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParticlePtr
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddParticle(xmlSchemaParserCtxtPtr ctxt,
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlNodePtr node, int min, int max)
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr ret = NULL;
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(stderr, "Adding particle component\n");
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaParticlePtr)
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaParticle));
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "allocating particle component",
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_PARTICLE;
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->annot = NULL;
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->minOccurs = min;
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxOccurs = max;
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->children = NULL;
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
551260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that addition to pending components will be done locally
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the specific parsing function, since the most particles
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * need not to be fixed up (i.e. the reference to be resolved).
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REMOVED: WXS_ADD_PENDING(ctxt, ret);
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddModelGroupDefinition:
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the group name
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an XML schema Group definition
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaPtr schema,
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *name,
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *nsName,
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlNodePtr node)
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr ret = NULL;
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaModelGroupDefPtr)
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaModelGroupDef));
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "adding group", NULL);
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaModelGroupDef));
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_TYPE_GROUP;
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->isRedefine) {
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->redef = xmlSchemaAddRedef(ctxt, ctxt->redefined,
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, name, nsName);
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->redef == NULL) {
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ret);
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
556160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->redefCounter = 0;
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_PENDING(ctxt, ret);
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewWildcardNs:
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new wildcard namespace constraint.
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardNsPtr
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewWildcardNsConstraint(xmlSchemaParserCtxtPtr ctxt)
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr ret;
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaWildcardNsPtr)
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaWildcardNs));
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(ctxt, "creating wildcard namespace constraint", NULL);
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = NULL;
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddIDC(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const xmlChar *name, const xmlChar *nsName,
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int category, xmlNodePtr node)
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
559860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaIDCPtr ret = NULL;
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (name == NULL))
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaIDCPtr) xmlMalloc(sizeof(xmlSchemaIDC));
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt,
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating an identity-constraint definition", NULL);
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaIDC));
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The target namespace of the parent element declaration. */
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->targetNamespace = nsName;
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->name = name;
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = category;
561460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
561560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_GLOBAL(ctxt, ret);
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Only keyrefs need to be fixup up.
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (category == XML_SCHEMA_TYPE_IDC_KEYREF)
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, ret);
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddWildcard:
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds a wildcard.
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It corresponds to a xsd:anyAttribute and xsd:any.
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new struture or NULL in case of error
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddWildcard(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaTypeType type, xmlNodePtr node)
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr ret = NULL;
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL))
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "adding wildcard", NULL);
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaWildcard));
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = type;
565160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->node = node;
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_ADD_LOCAL(ctxt, ret);
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupFree(xmlSchemaSubstGroupPtr group)
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group == NULL)
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group->members != NULL)
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(group->members);
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(group);
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSubstGroupPtr
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupAdd(xmlSchemaParserCtxtPtr pctxt,
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaElementPtr head)
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr ret;
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Init subst group hash. */
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_GROUPS(pctxt) == NULL) {
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_SUBST_GROUPS(pctxt) = xmlHashCreateDict(10, pctxt->dict);
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_SUBST_GROUPS(pctxt) == NULL)
5676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
5677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create a new substitution group. */
5679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSubstGroupPtr) xmlMalloc(sizeof(xmlSchemaSubstGroup));
5680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a substitution group container", NULL);
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSubstGroup));
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->head = head;
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create list of members. */
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->members = xmlSchemaItemListCreate();
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->members == NULL) {
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSubstGroupFree(ret);
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Add subst group to hash. */
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashAddEntry2(WXS_SUBST_GROUPS(pctxt),
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	head->name, head->targetNamespace, ret) != 0) {
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaSubstGroupAdd",
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to add a new substitution container");
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSubstGroupFree(ret);
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSubstGroupPtr
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSubstGroupGet(xmlSchemaParserCtxtPtr pctxt,
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaElementPtr head)
570760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_GROUPS(pctxt) == NULL)
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlHashLookup2(WXS_SUBST_GROUPS(pctxt),
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	head->name, head->targetNamespace));
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 * xmlSchemaAddElementSubstitutionMember:
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema parser context
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @head:  the head of the substitution group
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @member: the new member of the substitution group
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new annotation structure.
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddElementSubstitutionMember(xmlSchemaParserCtxtPtr pctxt,
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaElementPtr head,
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaElementPtr member)
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr substGroup = NULL;
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (head == NULL) || (member == NULL))
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    substGroup = xmlSchemaSubstGroupGet(pctxt, head);
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL)
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	substGroup = xmlSchemaSubstGroupAdd(pctxt, head);
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL)
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaItemListAdd(substGroup->members, member) == -1)
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Utilities for parsing					*
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeQNameValue:
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the parent as a schema object
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the QName value
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts the local name and the URI of a QName value and validates it.
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used on attribute values that
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should resolve to schema components.
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeQNameValue(xmlSchemaParserCtxtPtr ctxt,
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr ownerItem,
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlAttrPtr attr,
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar *value,
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **uri,
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **local)
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *pref;
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNsPtr ns;
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len, ret;
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *uri = NULL;
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = NULL;
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0) {
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, (xmlNodePtr) attr,
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, value, NULL, NULL, NULL);
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = value;
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret < 0)
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!strchr((char *) value, ':')) {
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ns = xmlSearchNs(attr->doc, attr->parent, NULL);
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns)
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) {
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: move XML_SCHEMAS_INCLUDING_CONVERT_NS to the
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * parser context. */
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one takes care of included schemas with no
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * target namespace.
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *uri = ctxt->targetNamespace;
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = xmlDictLookup(ctxt->dict, value, -1);
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * At this point xmlSplitQName3 has to return a local name.
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = xmlSplitQName3(value, &len);
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *local = xmlDictLookup(ctxt->dict, *local, -1);
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pref = xmlDictLookup(ctxt->dict, value, len);
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = xmlSearchNs(attr->doc, attr->parent, pref);
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns == NULL) {
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, (xmlNodePtr) attr,
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), NULL, value,
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value '%s' of simple type 'xs:QName' has no "
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "corresponding namespace declaration in scope", value, NULL);
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *uri = xmlDictLookup(ctxt->dict, ns->href, -1);
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeQName:
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the owner element
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the attribute node
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the QName of an attribute value.
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used on attribute values that
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * should resolve to schema components.
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeQName(xmlSchemaParserCtxtPtr ctxt,
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr ownerItem,
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlAttrPtr attr,
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **uri,
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       const xmlChar **local)
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ownerItem, attr, value, uri, local));
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrQName:
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem:  the parent node of the attribute
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @local: the resulting local part if found, the attribute value otherwise
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @uri:  the resulting namespace URI if found
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the QName of an attribute value.
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the QName is valid, a positive error code
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrQName(xmlSchemaParserCtxtPtr ctxt,
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaPtr schema,
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaBasicItemPtr ownerItem,
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr ownerElem,
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const char *name,
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar **uri,
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar **local)
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, name);
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*local = NULL;
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*uri = NULL;
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeQName(ctxt, schema,
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ownerItem, attr, uri, local));
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrID:
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema context
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the owner as a schema object
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem:  the parent node of the attribute
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates the ID of an attribute value.
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0, in case the ID is valid, a positive error code
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not valid and -1 if an internal error occurs.
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeID(xmlSchemaParserCtxtPtr ctxt, xmlAttrPtr attr)
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetNodeContentNoDict((xmlNodePtr) attr);
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateNCName(value, 1);
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: the IDness might have already be declared in the DTD
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->atype != XML_ATTRIBUTE_ID) {
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlIDPtr res;
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *strip;
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Use xmlSchemaStrip here; it's not exported at this
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * moment.
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    strip = xmlSchemaCollapseString(value);
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (strip != NULL) {
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) value);
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = strip;
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	    res = xmlAddID(NULL, attr->doc, value, attr);
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == NULL) {
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL, "Duplicate value '%s' of simple "
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type 'xs:ID'", value, NULL);
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->atype = XML_ATTRIBUTE_ID;
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret > 0) {
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr,
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ID),
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, "The value '%s' of simple type 'xs:ID' is "
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "not a valid 'xs:NCName'",
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value, NULL);
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar *)value);
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrID(xmlSchemaParserCtxtPtr ctxt,
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNodePtr ownerElem,
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar *name)
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, (const char *) name);
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaPValAttrNodeID(ctxt, attr));
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetMaxOccurs:
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the maxOccurs property
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, or the value
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetMaxOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int min, int max, int def, const char *expected)
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val, *cur;
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "maxOccurs");
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(val, (const xmlChar *) "unbounded")) {
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (max != UNBOUNDED) {
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* XML_SCHEMAP_INVALID_MINOCCURS, */
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL, expected,
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (def);
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (UNBOUNDED);  /* encoding it with -1 might be another option */
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0) {
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ret * 10 + (*cur - '0');
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Restrict the maximal value to Integer.
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetMinOccurs:
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the minOccurs property
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, or the value
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetMinOccurs(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node,
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int min, int max, int def, const char *expected)
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val, *cur;
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "minOccurs");
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (def);
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = val;
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*cur == 0) {
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((*cur >= '0') && (*cur <= '9')) {
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ret * 10 + (*cur - '0');
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Restrict the maximal value to Integer.
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*cur != 0) || (ret < min) || ((max != -1) && (ret > max))) {
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(ctxt,
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAP_INVALID_MINOCCURS, */
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr, NULL, expected,
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    val, NULL, NULL, NULL);
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPGetBoolNodeValue:
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes:  owner designation
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem:  the owner as a schema item
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node holding the value
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Converts a boolean string value into 1 or 0.
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 or 1.
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPGetBoolNodeValue(xmlSchemaParserCtxtPtr ctxt,
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlNodePtr node)
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0;
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlNodeGetContent(node);
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.2.1 Lexical representation
612360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * An instance of a datatype that is defined as �boolean�
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can have the following legal literals {true, false, 1, 0}.
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(BAD_CAST value, BAD_CAST "true"))
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 1;
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "false"))
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 0;
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "1"))
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = 1;
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(BAD_CAST value, BAD_CAST "0"))
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res = 0;
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INVALID_BOOLEAN,
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ownerItem, node,
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, BAD_CAST value,
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL);
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(value);
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (res);
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetBooleanProp:
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the default value
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluate if a boolean property is set
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the default if not found, 0 if found to be false,
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 if found to be true
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetBooleanProp(xmlSchemaParserCtxtPtr ctxt,
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  const char *name, int def)
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetProp(ctxt, node, name);
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (def);
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.2.1 Lexical representation
617160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * An instance of a datatype that is defined as �boolean�
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can have the following legal literals {true, false, 1, 0}.
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(val, BAD_CAST "true"))
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 1;
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "false"))
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 0;
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "1"))
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	def = 1;
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(val, BAD_CAST "0"))
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = 0;
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INVALID_BOOLEAN,
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL,
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlNodePtr) xmlSchemaGetPropNode(node, name),
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, val, NULL, NULL, NULL);
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Shema extraction from an Infoset			*
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt, xmlSchemaPtr schema,
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 xmlNodePtr node,
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						 int topLevel);
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseComplexType(xmlSchemaParserCtxtPtr
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt,
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlSchemaPtr schema,
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlNodePtr node,
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  int topLevel);
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseRestriction(xmlSchemaParserCtxtPtr
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt,
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlSchemaPtr schema,
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  xmlNodePtr node,
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						  xmlSchemaTypeType parentType);
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaItemListPtr uses,
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int parentType);
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr xmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt,
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlSchemaPtr schema,
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlNodePtr node);
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema, xmlNodePtr node);
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNodeValue:
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the schema attribute node being validated
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the value
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates a value against the given built-in type.
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNodeValue(xmlSchemaParserCtxtPtr pctxt,
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlAttrPtr attr,
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *value,
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type)
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Should we move this to xmlschematypes.c? Hmm, but this
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * one is really meant to be used internally, so better not.
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (type == NULL) || (attr == NULL))
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_BASIC) {
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaPValAttrNodeValue",
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the given type is not a built-in type");
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type->builtInType) {
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_NCNAME:
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_QNAME:
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_ANYURI:
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_TOKEN:
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMAS_LANGUAGE:
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValPredefTypeNode(type, value, NULL,
6270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) attr);
6271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
6272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default: {
6273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaPValAttrNodeValue",
6274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validation using the given type is not supported while "
6275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"parsing a schema");
6276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
6277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Should we use the S4S error codes instead?
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaPValAttrNodeValue",
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to validate a schema attribute value");
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret > 0) {
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_LIST(type))
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
629160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaPSimpleTypeErr(pctxt,
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret, ownerItem, (xmlNodePtr) attr,
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, NULL, value, NULL, NULL, NULL);
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrNode:
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  the schema attribute node being validated
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the resulting value if any
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates a value against the given built-in type.
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrNode(xmlSchemaParserCtxtPtr ctxt,
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaBasicItemPtr ownerItem,
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlAttrPtr attr,
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type,
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **value)
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (type == NULL) || (attr == NULL))
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value != NULL)
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = val;
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNodeValue(ctxt, ownerItem, attr,
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val, type));
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttr:
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the element node of the attribute
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerDes: the designation of the parent element
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerItem: the schema object owner if existent
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ownerElem: the owner element node
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the schema attribute node
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the built-in type to be validated against
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the resulting value if any
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extracts and validates a value against the given built-in type.
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used internally for validation
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of schema attribute values during parsing of the schema.
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, a positive error code
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
635560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaPValAttr(xmlSchemaParserCtxtPtr ctxt,
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaBasicItemPtr ownerItem,
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlNodePtr ownerElem,
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const char *name,
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type,
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar **value)
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (type == NULL)) {
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_BASIC) {
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, ownerElem,
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaPValAttr, the given "
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "type '%s' is not a built-in type.\n",
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->name, NULL);
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(ownerElem, name);
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL)
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *value = NULL;
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaPValAttrNode(ctxt, ownerItem, attr,
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type, value));
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckReference(xmlSchemaParserCtxtPtr pctxt,
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaPtr schema ATTRIBUTE_UNUSED,
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlAttrPtr attr,
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *namespaceName)
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Pointer comparison instead? */
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(pctxt->targetNamespace, namespaceName))
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(xmlSchemaNs, namespaceName))
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check if the referenced namespace was <import>ed.
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_BUCKET(pctxt)->relations != NULL) {
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel;
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	rel = WXS_BUCKET(pctxt)->relations;
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_BUCKET_IMPMAIN(rel->type) &&
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlStrEqual(namespaceName, rel->importNamespace))
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No matching <import>ed namespace found.
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr n = (attr != NULL) ? (xmlNodePtr) attr : node;
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (namespaceName == NULL)
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"References from this schema to components in no "
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"namespace are not allowed, since not indicated by an "
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"import statement", NULL, NULL);
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE, n, NULL,
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"References from this schema to components in the "
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"namespace '%s' are not allowed, since not indicated by an "
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"import statement", namespaceName, NULL);
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_SCHEMAP_SRC_RESOLVE);
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseLocalAttributes:
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the hosting type where the attributes will be anchored
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses attribute uses and attribute declarations and
644560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * attribute group references.
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttributes(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr *child, xmlSchemaItemListPtr *list,
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int parentType, int *hasRefs)
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *item;
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((IS_SCHEMA((*child), "attribute")) ||
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           (IS_SCHEMA((*child), "attributeGroup"))) {
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_SCHEMA((*child), "attribute")) {
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = xmlSchemaParseLocalAttribute(ctxt, schema, *child,
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*list, parentType);
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            item = xmlSchemaParseAttributeGroupRef(ctxt, schema, *child);
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((item != NULL) && (hasRefs != NULL))
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*hasRefs = 1;
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (item != NULL) {
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*list == NULL) {
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Customize grow factor. */
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*list = xmlSchemaItemListCreate();
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*list == NULL)
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListAddSize(*list, 2, item) == -1)
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *child = (*child)->next;
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAnnotation:
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attrribute declaration
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnnotation(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr node, int needed)
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr ret;
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int barked = 0;
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * INFO: S4S completed.
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * id = ID
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {any attributes with non-schema namespace . . .}>
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Content: (appinfo | documentation)*
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (node == NULL))
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (needed)
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewAnnot(ctxt, node);
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = NULL;
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((attr->ns == NULL) &&
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (!xmlStrEqual(attr->name, BAD_CAST "id"))) ||
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((attr->ns != NULL) &&
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
6531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "appinfo")) {
6532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: make available the content of "appinfo". */
6533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * source = anyURI
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {any attributes with non-schema namespace . . .}>
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Content: ({any})*
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = child->properties;
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (attr != NULL) {
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((attr->ns == NULL) &&
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     (!xmlStrEqual(attr->name, BAD_CAST "source"))) ||
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     ((attr->ns != NULL) &&
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      xmlStrEqual(attr->ns->href, xmlSchemaNs))) {
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = attr->next;
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttr(ctxt, NULL, child, "source",
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "documentation")) {
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: make available the content of "documentation". */
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * source = anyURI
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {any attributes with non-schema namespace . . .}>
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Content: ({any})*
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = child->properties;
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (attr != NULL) {
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (attr->ns == NULL) {
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!xmlStrEqual(attr->name, BAD_CAST "source")) {
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(attr->ns->href, xmlSchemaNs) ||
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlStrEqual(attr->name, BAD_CAST "lang") &&
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->ns->href, XML_XML_NAMESPACE)))) {
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = attr->next;
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Attribute "xml:lang".
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNodeNs(child, (const char *) XML_XML_NAMESPACE, "lang");
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL)
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPValAttrNode(ctxt, NULL, attr,
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_LANGUAGE), NULL);
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!barked)
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child, NULL, "(appinfo | documentation)*");
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    barked = 1;
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseFacet:
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Facet declaration
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new type structure or NULL in case of error
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaFacetPtr
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseFacet(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr node)
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *value;
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet = xmlSchemaNewFacet();
6622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL) {
6623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt, "allocating facet", node);
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->node = node;
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = xmlSchemaGetProp(ctxt, node, "value");
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL) {
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_FACET_NO_VALUE,
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Facet %s has no value\n", node->name, NULL);
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(node, "minInclusive")) {
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "minExclusive")) {
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxInclusive")) {
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxExclusive")) {
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "totalDigits")) {
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "fractionDigits")) {
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "pattern")) {
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_PATTERN;
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "enumeration")) {
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_ENUMERATION;
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "whiteSpace")) {
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_WHITESPACE;
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "length")) {
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_LENGTH;
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "maxLength")) {
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXLENGTH;
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(node, "minLength")) {
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINLENGTH;
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_TYPE,
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Unknown facet type %s\n", node->name, NULL);
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->value = value;
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *fixed;
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fixed = xmlSchemaGetProp(ctxt, node, "fixed");
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fixed != NULL) {
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(fixed, BAD_CAST "true"))
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet->fixed = 1;
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_UNKNOWN_FACET_CHILD,
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Facet %s has unexpected child content\n",
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       node->name, NULL);
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (facet);
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseWildcardNs:
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wildc:  the wildcard, already created
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses the attribute "processContents" and "namespace"
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of a xsd:anyAttribute and xsd:any.
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if everything goes fine, a positive error code
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if something is not valid and -1 if an internal error occurs.
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseWildcardNs(xmlSchemaParserCtxtPtr ctxt,
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaPtr schema ATTRIBUTE_UNUSED,
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaWildcardPtr wildc,
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node)
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *pc, *ns, *dictnsItem;
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *nsItem;
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr tmp, lastNs = NULL;
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pc = xmlSchemaGetProp(ctxt, node, "processContents");
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pc == NULL)
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        || (xmlStrEqual(pc, (const xmlChar *) "strict"))) {
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(pc, (const xmlChar *) "skip")) {
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_SKIP;
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(pc, (const xmlChar *) "lax")) {
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_LAX;
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPSimpleTypeErr(ctxt,
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(strict | skip | lax)", pc,
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL, NULL);
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        wildc->processContents = XML_SCHEMAS_ANY_STRICT;
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Build the namespace constraints.
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "namespace");
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ns = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attr == NULL) || (xmlStrEqual(ns, BAD_CAST "##any")))
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->any = 1;
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (xmlStrEqual(ns, BAD_CAST "##other")) {
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wildc->negNsSet == NULL) {
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wildc->negNsSet->value = ctxt->targetNamespace;
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end, *cur;
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = ns;
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsItem = xmlStrndup(cur, end - cur);
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xmlStrEqual(nsItem, BAD_CAST "##other")) ||
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlStrEqual(nsItem, BAD_CAST "##any"))) {
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER,
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL,
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "((##any | ##other) | List of (xs:anyURI | "
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "(##targetNamespace | ##local)))",
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nsItem, NULL, NULL, NULL);
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_WILDCARD_INVALID_NS_MEMBER;
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(nsItem, BAD_CAST "##targetNamespace")) {
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = ctxt->targetNamespace;
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(nsItem, BAD_CAST "##local")) {
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = NULL;
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Validate the item (anyURI).
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeValue(ctxt, NULL, attr,
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsItem, xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI));
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    dictnsItem = xmlDictLookup(ctxt->dict, nsItem, -1);
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Avoid dublicate namespaces.
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = wildc->nsSet;
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (tmp != NULL) {
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (dictnsItem == tmp->value)
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = tmp->next;
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == NULL) {
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (tmp == NULL) {
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(nsItem);
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp->value = dictnsItem;
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp->next = NULL;
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (wildc->nsSet == NULL)
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wildc->nsSet = tmp;
6800df143a5041f03a22808b59c76698770b74692815Selim Gurun		    else if (lastNs != NULL)
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lastNs->next = tmp;
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastNs = tmp;
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsItem);
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPCheckParticleCorrect_2(xmlSchemaParserCtxtPtr ctxt,
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr item ATTRIBUTE_UNUSED,
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlNodePtr node,
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int minOccurs,
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int maxOccurs) {
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((maxOccurs == 0) && ( minOccurs == 0))
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (maxOccurs != UNBOUNDED) {
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Maybe we should better not create the particle,
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if min/max is invalid, since it could confuse the build of the
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* content model.
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.9.6 Schema Component Constraint: Particle Correct
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (maxOccurs < 1) {
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.2 {max occurs} must be greater than or equal to 1.
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomAttrErr(ctxt,
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_P_PROPS_CORRECT_2_2,
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetPropNode(node, "maxOccurs"),
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value must be greater than or equal to 1");
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_2);
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (minOccurs > maxOccurs) {
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.1 {min occurs} must not be greater than {max occurs}.
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomAttrErr(ctxt,
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_P_PROPS_CORRECT_2_1,
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetPropNode(node, "minOccurs"),
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value must not be greater than the value of 'maxOccurs'");
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_P_PROPS_CORRECT_2_1);
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAny:
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsea a XML schema <any> element. A particle and wildcard
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be created (except if minOccurs==maxOccurs==0, in this case
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * nothing will be created).
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the particle or NULL in case of error or if minOccurs==maxOccurs==0
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParticlePtr
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAny(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                  xmlNodePtr node)
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle;
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr wild;
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max;
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot = NULL;
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * minOccurs/maxOccurs.
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"(xs:nonNegativeInteger | unbounded)");
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1,
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"xs:nonNegativeInteger");
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create & parse the wildcard.
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    wild = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY, node);
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild == NULL)
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParseWildcardNs(ctxt, schema, wild, node);
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        annot = xmlSchemaParseAnnotation(ctxt, child, 1);
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No component if minOccurs==maxOccurs==0.
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((min == 0) && (max == 0)) {
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Don't free the wildcard, since it's already on the list. */
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the particle.
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle = xmlSchemaAddParticle(ctxt, node, min, max);
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle->annot = annot;
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle->children = (xmlSchemaTreeItemPtr) wild;
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (particle);
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseNotation:
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Notation declaration
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new structure or NULL in case of error
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNotationPtr
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNotation(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNotationPtr ret;
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlSchemaGetProp(ctxt, node, "name");
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErr2(ctxt, node, child, XML_SCHEMAP_NOTATION_NO_NAME,
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Notation has no name\n", NULL, NULL);
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddNotation(ctxt, schema, name,
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->targetNamespace, node);
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAnyAttribute:
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema AnyAttrribute declaration
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a wildcard or NULL.
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWildcardPtr
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAnyAttribute(xmlSchemaParserCtxtPtr ctxt,
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlSchemaPtr schema, xmlNodePtr node)
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr ret;
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddWildcard(ctxt, schema, XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node);
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        (!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "processContents"))) {
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the namespace list.
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseWildcardNs(ctxt, schema, ret, node) != 0)
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttribute:
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attrribute declaration
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute declaration.
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseLocalAttribute(xmlSchemaParserCtxtPtr pctxt,
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaItemListPtr uses,
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int parentType)
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue, *name = NULL, *ns = NULL;
708860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttributeUsePtr use = NULL;
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *tmpNs = NULL, *tmpName = NULL, *defValue = NULL;
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isRef = 0, occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int	nberrors, hasForm = 0, defValueType = 0;
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_DEF_VAL_DEFAULT 1
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ATTR_DEF_VAL_FIXED 2
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 3.2.3 Constraints on XML Representations of Attribute Declarations
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNodeQName(pctxt, schema,
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, attr, &tmpNs, &tmpName) != 0) {
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckReference(pctxt, schema, node, attr, tmpNs) != 0)
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isRef = 1;
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nberrors = pctxt->nberrors;
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (isRef) {
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "id")) {
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeID(pctxt, attr);
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "ref")) {
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "id")) {
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeID(pctxt, attr);
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "type")) {
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPValAttrNodeQName(pctxt, schema, NULL,
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attr, &tmpNs, &tmpName);
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "form")) {
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Evaluate the target namespace
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
714260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    hasForm = 1;
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(pctxt,
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = pctxt->targetNamespace;
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified"))
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(pctxt,
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr,
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, "(qualified | unqualified)",
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto attr_next;
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->name, BAD_CAST "use")) {
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Maybe we need to normalize the value beforehand. */
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attrValue, BAD_CAST "optional"))
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_OPTIONAL;
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (xmlStrEqual(attrValue, BAD_CAST "prohibited"))
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_PROHIBITED;
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (xmlStrEqual(attrValue, BAD_CAST "required"))
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    occurs = XML_SCHEMAS_ATTR_USE_REQUIRED;
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else {
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(pctxt,
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_INVALID_ATTR_USE,
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(optional | prohibited | required)",
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "default")) {
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.2.3 : 1
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (defValue) {
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPMutualExclAttrErr(pctxt,
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_1,
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, attr, "default", "fixed");
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValueType = WXS_ATTR_DEF_VAL_DEFAULT;
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "fixed")) {
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.2.3 : 1
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (defValue) {
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPMutualExclAttrErr(pctxt,
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_1,
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, attr, "default", "fixed");
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    defValueType = WXS_ATTR_DEF_VAL_FIXED;
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto attr_next;
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (! xmlStrEqual(attr->ns->href, xmlSchemaNs))
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto attr_next;
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPIllegalAttrErr(pctxt,
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectattr_next:
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
721360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.3 : 2
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If default and use are both present, use must have
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the actual value optional.
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((defValueType == WXS_ATTR_DEF_VAL_DEFAULT) &&
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(occurs != XML_SCHEMAS_ATTR_USE_OPTIONAL)) {
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_ATTRIBUTE_2,
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(optional | prohibited | required)", NULL,
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value of the attribute 'use' must be 'optional' "
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "if the attribute 'default' is present",
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We want correct attributes.
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nberrors != pctxt->nberrors)
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isRef) {
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributePtr attrDecl;
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: move XML_SCHEMAS_QUALIF_ATTR to the parser. */
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! hasForm) && (schema->flags & XML_SCHEMAS_QUALIF_ATTR))
723960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ns = pctxt->targetNamespace;
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.6 Schema Component Constraint: xsi: Not Allowed
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move this to the component layer.
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(ns, xmlSchemaInstanceNs)) {
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_NO_XSI,
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The target namespace must not match '%s'",
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInstanceNs, NULL);
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "name", NULL);
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.6 Schema Component Constraint: xmlns Not Allowed
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move this to the component layer.
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(name, BAD_CAST "xmlns")) {
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(pctxt,
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_NO_XMLNS,
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr,
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the attribute must not match 'xmlns'",
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED)
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto check_children;
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute use component.
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = xmlSchemaAddAttributeUse(pctxt, node);
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use == NULL)
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->occurs = occurs;
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute declaration.
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrDecl = xmlSchemaAddAttribute(pctxt, schema, name, ns, node, 0);
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attrDecl == NULL)
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmpName != NULL) {
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->typeName = tmpName;
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->typeNs = tmpNs;
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->attrDecl = attrDecl;
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Value constraint.
729660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (defValue != NULL) {
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrDecl->defValue = defValue;
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrDecl->flags |= XML_SCHEMAS_ATTR_FIXED;
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (occurs != XML_SCHEMAS_ATTR_USE_PROHIBITED) {
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref;
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute use component.
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = xmlSchemaAddAttributeUse(pctxt, node);
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (use == NULL)
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need to resolve the reference at later stage.
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(pctxt, use);
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->occurs = occurs;
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a QName reference to the attribute declaration.
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = xmlSchemaNewQNameRef(pctxt, XML_SCHEMA_TYPE_ATTRIBUTE,
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpName, tmpNs);
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ref == NULL)
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Assign the reference. This will be substituted for the
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* referenced attribute declaration when the QName is resolved.
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use->attrDecl = WXS_ATTR_CAST ref;
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Value constraint.
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (defValue != NULL)
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->defValue = defValue;
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defValueType == WXS_ATTR_DEF_VAL_FIXED)
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use->flags |= XML_SCHEMA_ATTR_USE_FIXED;
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
733660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcheck_children:
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (occurs == XML_SCHEMAS_ATTR_USE_PROHIBITED) {
734360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaAttributeUseProhibPtr prohib;
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(pctxt, child, 0);
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt,
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?)");
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for pointlessness of attribute prohibitions.
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
735860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (parentType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) {
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Skipping attribute use prohibition, since it is "
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pointless inside an <attributeGroup>",
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL);
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (parentType == XML_SCHEMA_TYPE_EXTENSION) {
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Skipping attribute use prohibition, since it is "
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pointless when extending a type",
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, NULL);
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! isRef) {
737660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    tmpName = name;
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpNs = ns;
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for duplicate attribute prohibitions.
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uses) {
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
738460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < uses->nbItems; i++) {
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = uses->items[i];
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) &&
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpName == (WXS_ATTR_PROHIB_CAST use)->name) &&
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (tmpNs == (WXS_ATTR_PROHIB_CAST use)->targetNamespace))
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
739260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			node, NULL,
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping duplicate attribute use prohibition '%s'",
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str, tmpNs, tmpName),
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
739960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    FREE_AND_NULL(str)
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
740160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the attribute prohibition helper component.
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib = xmlSchemaAddAttributeUseProhib(pctxt);
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prohib == NULL)
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->node = node;
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->name = tmpName;
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->targetNamespace = tmpNs;
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isRef) {
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We need at least to resolve to the attribute declaration.
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ADD_PENDING(pctxt, prohib);
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(WXS_BASIC_CAST prohib);
742060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Should this go into the attr decl?
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isRef) {
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (child != NULL) {
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (IS_SCHEMA(child, "simpleType"))
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 3.2.3 : 3.2
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * If ref is present, then all of <simpleType>,
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * form and type must be absent.
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt,
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ATTRIBUTE_3_2,
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child, NULL,
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"(annotation?)");
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt,
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child, NULL,
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"(annotation?)");
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "simpleType")) {
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_ATTRUSE_DECL(use)->typeName != NULL) {
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 3.2.3 : 4
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * type and <simpleType> must not both be present.
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node, child,
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The attribute 'type' and the <simpleType> child "
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"are mutually exclusive", NULL);
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use) =
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaParseSimpleType(pctxt, schema, child, 0);
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child = child->next;
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (child != NULL)
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, simpleType?)");
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
746760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (WXS_BASIC_CAST use);
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributePtr
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseGlobalAttribute(xmlSchemaParserCtxtPtr pctxt,
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaPtr schema,
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlNodePtr node)
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue;
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr ret;
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Note that the w3c spec assumes the schema to be validated with schema
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * for schemas beforehand.
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 3.2.3 Constraints on XML Representations of Attribute Declarations
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
748960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return (NULL);
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.3 : 3.1
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * One of ref or name must be present, but not both
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt, XML_SCHEMAP_S4S_ATTR_MISSING,
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "name", NULL);
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0) {
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.6 Schema Component Constraint: xmlns Not Allowed
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Move this to the component layer.
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(attrValue, BAD_CAST "xmlns")) {
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NO_XMLNS,
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, (xmlNodePtr) attr,
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), NULL, NULL,
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The value of the attribute must not match 'xmlns'",
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.2.6 Schema Component Constraint: xsi: Not Allowed
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Move this to the component layer.
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       Or better leave it here and add it to the component layer
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *       if we have a schema construction API.
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(pctxt->targetNamespace, xmlSchemaInstanceNs)) {
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomErr(ACTXT_CAST pctxt,
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NO_XSI, node, NULL,
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The target namespace must not match '%s'",
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaInstanceNs, NULL);
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddAttribute(pctxt, schema, attrValue,
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->targetNamespace, node, 1);
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->flags |= XML_SCHEMAS_ATTR_GLOBAL;
753560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "default")) &&
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "type")))
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
754960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrQName(pctxt, schema, NULL,
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, "type", &ret->typeNs, &ret->typeName);
755960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "fixed".
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defValue = xmlSchemaGetProp(pctxt, node, "fixed");
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->defValue != NULL)
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->flags |= XML_SCHEMAS_ATTR_FIXED;
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "default".
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "default");
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.3 : 1
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* default and fixed must not both be present.
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->flags & XML_SCHEMAS_ATTR_FIXED) {
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMutualExclAttrErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_1,
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST ret, attr, "default", "fixed");
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->defValue = xmlSchemaGetNodeContent(pctxt, (xmlNodePtr) attr);
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret->typeName != NULL) {
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.2.3 : 4
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type and <simpleType> must not both be present.
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt, XML_SCHEMAP_SRC_ATTRIBUTE_4,
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'type' and the <simpleType> child "
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"are mutually exclusive", NULL);
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->subtypes = xmlSchemaParseSimpleType(pctxt, schema, child, 0);
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL)
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, simpleType?)");
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttributeGroupRef:
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an attribute group definition reference.
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that a reference to an attribute group does not
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * correspond to any component at all.
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group or NULL in case of error.
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt,
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node)
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ret;
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *refNs = NULL, *ref = NULL;
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "ref", NULL);
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
764460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrNodeQName(pctxt, schema,
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr, &refNs, &ref);
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckReference(pctxt, schema, node, attr, refNs) != 0)
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
764960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")))
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Attribute ID */
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We do not have a place to store the annotation, do we?
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseAnnotation(pctxt, child, 0);
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle attribute group redefinitions.
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->isRedefine && pctxt->redef &&
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(pctxt->redef->item->type ==
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ref == pctxt->redef->refName) &&
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(refNs == pctxt->redef->refTargetNs))
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC src-redefine:
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (7.1) "If it has an <attributeGroup> among its contents
770160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* the �actual value� of whose ref [attribute] is the same
770260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* as the �actual value� of its own name attribute plus
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* target namespace, then it must have exactly one such group."
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->redefCounter != 0) {
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
770760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The redefining attribute group definition "
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"'%s' must not contain more than one "
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"reference to the redefined definition",
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, refNs, ref), NULL);
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefCounter++;
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: How to ensure that the reference will not be
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* handled by the normal component resolution mechanism?
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewQNameRef(pctxt,
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->node = node;
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redef->reference = WXS_BASIC_CAST ret;
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a QName-reference helper component. We will substitute this
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* component for the attribute uses of the referenced attribute group
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition.
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaNewQNameRef(pctxt,
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTEGROUP, ref, refNs);
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == NULL)
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->node = node;
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Add to pending items, to be able to resolve the reference. */
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(pctxt, ret);
774160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseAttributeGroupDefinition:
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema validation context
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Attribute Group declaration
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the attribute group definition or NULL in case of error.
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttributeGroupPtr
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseAttributeGroupDefinition(xmlSchemaParserCtxtPtr pctxt,
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaPtr schema,
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlNodePtr node)
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr ret;
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasRefs = 0;
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "name", NULL);
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The name is crucial, exit if invalid.
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrNode(pctxt,
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr,
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddAttributeGroupDefinition(pctxt, schema,
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name, pctxt->targetNamespace, node);
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
778860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return (NULL);
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")))
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Attribute ID */
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->annot = xmlSchemaParseAnnotation(pctxt, child, 1);
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse contained attribute decls/refs.
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseLocalAttributes(pctxt, schema, &child,
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaItemListPtr *) &(ret->attrUses),
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_TYPE_ATTRIBUTEGROUP, &hasRefs) == -1)
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasRefs)
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->flags |= XML_SCHEMAS_ATTRGROUP_HAS_REFS;
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the attribute wildcard.
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "anyAttribute")) {
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->attributeWildcard = xmlSchemaParseAnyAttribute(pctxt,
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schema, child);
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, ((attribute | attributeGroup)*, anyAttribute?))");
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrFormDefault:
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: the flags to be modified
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagQualified: the specific flag for "qualified"
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, 1 otherwise.
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrFormDefault(const xmlChar *value,
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int *flags,
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int flagQualified)
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(value, BAD_CAST "qualified")) {
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if  ((*flags & flagQualified) == 0)
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *flags |= flagQualified;
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (!xmlStrEqual(value, BAD_CAST "unqualified"))
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaPValAttrBlockFinal:
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: the flags to be modified
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagAll: the specific flag for "#all"
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagExtension: the specific flag for "extension"
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagRestriction: the specific flag for "restriction"
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagSubstitution: the specific flag for "substitution"
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagList: the specific flag for "list"
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flagUnion: the specific flag for "union"
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value of the attribute "final" and "block". The value
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is converted into the specified flag values and returned in @flags.
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the value is valid, 1 otherwise.
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPValAttrBlockFinal(const xmlChar *value,
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *flags,
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagAll,
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagExtension,
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagRestriction,
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagSubstitution,
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagList,
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int flagUnion)
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This does not check for dublicate entries.
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((flags == NULL) || (value == NULL))
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value[0] == 0)
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(value, BAD_CAST "#all")) {
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (flagAll != -1)
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *flags |= flagAll;
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagExtension != -1)
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagExtension;
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagRestriction != -1)
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagRestriction;
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagSubstitution != -1)
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagSubstitution;
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagList != -1)
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagList;
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (flagUnion != -1)
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*flags |= flagUnion;
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end, *cur = value;
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *item;
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = xmlStrndup(cur, end - cur);
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(item, BAD_CAST "extension")) {
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagExtension != -1) {
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagExtension) == 0)
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagExtension;
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "restriction")) {
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagRestriction != -1) {
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagRestriction) == 0)
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagRestriction;
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "substitution")) {
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagSubstitution != -1) {
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagSubstitution) == 0)
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagSubstitution;
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "list")) {
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagList != -1) {
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagList) == 0)
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagList;
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(item, BAD_CAST "union")) {
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (flagUnion != -1) {
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((*flags & flagUnion) == 0)
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*flags |= flagUnion;
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = 1;
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item != NULL)
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(item);
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((ret == 0) && (*cur != 0));
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCSelectorXPath(xmlSchemaParserCtxtPtr ctxt,
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCPtr idc,
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCSelectPtr selector,
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlAttrPtr attr,
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isField)
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * c-selector-xpath:
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Selector Value OK
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: 1 The {selector} must be a valid XPath expression, as defined
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * in [XPath].
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (selector == NULL) {
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, idc->node,
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaCheckCSelectorXPath, "
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the selector is not specified.\n", NULL, NULL);
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL)
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = idc->node;
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node = (xmlNodePtr) attr;
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (selector->xpath == NULL) {
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Adjust error code. */
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The XPath expression of the selector is not valid", NULL);
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar **nsArray = NULL;
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr *nsList = NULL;
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compile the XPath expression.
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We need the array of in-scope namespaces for compilation.
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Call xmlPatterncompile with different options for selector/
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* field.
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL)
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsList = NULL;
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsList = xmlGetNsList(attr->doc, attr->parent);
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Build an array of prefixes and namespaces.
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsList != NULL) {
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, count = 0;
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; nsList[i] != NULL; i++)
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		count++;
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsArray = (const xmlChar **) xmlMalloc(
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(count * 2 + 1) * sizeof(const xmlChar *));
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsArray == NULL) {
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPErrMemory(ctxt, "allocating a namespace array",
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(nsList);
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < count; i++) {
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsArray[2 * i] = nsList[i]->href;
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsArray[2 * i + 1] = nsList[i]->prefix;
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsArray[count * 2] = NULL;
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsList);
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Differentiate between "selector" and "field".
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isField)
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, XML_PATTERN_XSFIELD, nsArray);
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    selector->xpathComp = (void *) xmlPatterncompile(selector->xpath,
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, XML_PATTERN_XSSEL, nsArray);
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsArray != NULL)
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree((xmlChar **) nsArray);
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (selector->xpathComp == NULL) {
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Adjust error code? */
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The XPath expression '%s' could not be "
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"compiled", selector->xpath);
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_S4S_ATTR_INVALID_VALUE);
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ADD_ANNOTATION(annot)   \
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr cur = item->annot; \
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->annot == NULL) {  \
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = annot;    \
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (annot);         \
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }                           \
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = item->annot;          \
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->next != NULL) {    \
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;	\
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }                           \
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = annot;
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssignAnnotation:
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the schema component
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @annot: the annotation
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Adds the annotation to the given schema component.
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the given annotaion.
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAnnotPtr
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddAnnotation(xmlSchemaAnnotItemPtr annItem,
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaAnnotPtr annot)
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((annItem == NULL) || (annot == NULL))
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (annItem->type) {
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ELEMENT: {
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaElementPtr item = (xmlSchemaElementPtr) annItem;
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTE: {
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributePtr item = (xmlSchemaAttributePtr) annItem;
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY_ATTRIBUTE:
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY: {
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaWildcardPtr item = (xmlSchemaWildcardPtr) annItem;
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_PARTICLE:
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEY:
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_KEYREF:
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_IDC_UNIQUE: {
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAnnotItemPtr item = (xmlSchemaAnnotItemPtr) annItem;
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: {
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaAttributeGroupPtr item =
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeGroupPtr) annItem;
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_NOTATION: {
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaNotationPtr item = (xmlSchemaNotationPtr) annItem;
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MININCLUSIVE:
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINEXCLUSIVE:
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXINCLUSIVE:
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_TOTALDIGITS:
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_FRACTIONDIGITS:
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_PATTERN:
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION:
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_WHITESPACE:
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_LENGTH:
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MAXLENGTH:
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_MINLENGTH: {
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr item = (xmlSchemaFacetPtr) annItem;
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SIMPLE:
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_COMPLEX: {
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr item = (xmlSchemaTypePtr) annItem;
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP: {
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupDefPtr item = (xmlSchemaModelGroupDefPtr) annItem;
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_SEQUENCE:
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_CHOICE:
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ALL: {
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupPtr item = (xmlSchemaModelGroupPtr) annItem;
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ADD_ANNOTATION(annot)
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPCustomErr(NULL,
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaAddAnnotation, "
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The item is not a annotated schema component", NULL);
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     break;
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (annot);
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseIDCSelectorAndField:
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML Schema identity-contraint definition's
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <selector> and <field> elements.
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parsed identity-constraint definition.
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCSelectPtr
818860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaParseIDCSelectorAndField(xmlSchemaParserCtxtPtr ctxt,
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaIDCPtr idc,
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr node,
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int isField)
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr item;
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "xpath"))) {
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the item.
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = (xmlSchemaIDCSelectPtr) xmlMalloc(sizeof(xmlSchemaIDCSelect));
8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL) {
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(ctxt,
8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a 'selector' of an identity-constraint definition",
8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(item, 0, sizeof(xmlSchemaIDCSelect));
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "xpath" (mandatory).
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "xpath");
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	xmlSchemaPMissingAttrErr(ctxt,
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->xpath = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: "field"s have an other syntax than "selector"s.
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCSelectorXPath(ctxt, idc, item, attr,
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isField) == -1) {
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt,
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlNodePtr) attr,
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaParseIDCSelectorAndField, "
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating the XPath expression of a IDC selector.\n",
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the parent IDC.
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) idc,
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?)");
8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseIDC:
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML Schema identity-contraint definition.
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parsed identity-constraint definition.
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaIDCPtr
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIDC(xmlSchemaParserCtxtPtr ctxt,
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaPtr schema,
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlNodePtr node,
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  xmlSchemaTypeType idcCategory,
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  const xmlChar *targetNamespace)
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr item = NULL;
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = NULL;
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCSelectPtr field = NULL, lastField = NULL;
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "name")) &&
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((idcCategory != XML_SCHEMA_TYPE_IDC_KEYREF) ||
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (!xmlStrEqual(attr->name, BAD_CAST "refer")))) {
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "name" (mandatory).
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNode(ctxt,
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, attr,
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the component. */
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddIDC(ctxt, schema, name, targetNamespace,
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idcCategory, node);
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idcCategory == XML_SCHEMA_TYPE_IDC_KEYREF) {
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "refer" (mandatory).
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "refer");
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"refer", NULL);
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create a reference item.
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_IDC_KEY,
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (item->ref == NULL)
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrNodeQName(ctxt, schema,
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(item->ref->targetNamespace),
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(item->ref->name));
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCheckReference(ctxt, schema, node, attr,
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		item->ref->targetNamespace);
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_MISSING,
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"A child element is missing",
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (selector, field+))");
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Child element <selector>.
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "selector")) {
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->selector = xmlSchemaParseIDCSelectorAndField(ctxt,
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item, child, 0);
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Child elements <field>.
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "field")) {
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		field = xmlSchemaParseIDCSelectorAndField(ctxt,
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item, child, 1);
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (field != NULL) {
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    field->index = item->nbFields;
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->nbFields++;
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (lastField != NULL)
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			lastField->next = field;
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			item->fields = field;
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastField = field;
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child = child->next;
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (IS_SCHEMA(child, "field"));
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "(annotation?, (selector, field+))");
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (selector, field+))");
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseElement:
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @topLevel: indicates if this is global declaration
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML schema element declaration.
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element declaration or a particle; NULL in case
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of an error or if the particle has minOccurs==maxOccurs==0.
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBasicItemPtr
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseElement(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node, int *isElemRef, int topLevel)
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr decl = NULL;
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = NULL;
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot = NULL;
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr, nameAttr;
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max, isRef = 0;
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *des = NULL;
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 3.3.3 Constraints on XML Representations of Element Declarations */
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Complete implementation of 3.3.6 */
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isElemRef != NULL)
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*isElemRef = 0;
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If we get a "ref" attribute on a local <element> we will assume it's
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a reference - even if there's a "name" attribute; this seems to be more
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * robust.
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nameAttr = xmlSchemaGetPropNode(node, "name");
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((topLevel) || (attr == NULL)) {
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nameAttr == NULL) {
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "name", NULL);
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isRef = 1;
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	annot = xmlSchemaParseAnnotation(ctxt, child, 1);
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip particle part if a global declaration.
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto declaration_part;
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The particle part ==================================================
8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1, "(xs:nonNegativeInteger | unbounded)");
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    particle = xmlSchemaAddParticle(ctxt, node, min, max);
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL)
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto return_null;
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* ret->flags |= XML_SCHEMAS_ELEM_REF; */
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (isRef) {
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *refNs = NULL, *ref = NULL;
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr refer = NULL;
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The reference part =============================================
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isElemRef != NULL)
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *isElemRef = 1;
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPValAttrNodeQName(ctxt, schema,
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, attr, &refNs, &ref);
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (3.3.3 : 2.1) "One of ref or name must be present, but not both"
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nameAttr != NULL) {
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMutualExclAttrErr(ctxt,
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_ELEMENT_2_1, NULL, nameAttr, "ref", "name");
8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "ref") ||
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "name") ||
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "id") ||
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "maxOccurs") ||
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlStrEqual(attr->name, BAD_CAST "minOccurs"))
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* SPEC (3.3.3 : 2.2) */
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomAttrErr(ctxt,
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_ELEMENT_2_2,
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, attr,
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Only the attributes 'minOccurs', 'maxOccurs' and "
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'id' are allowed in addition to 'ref'");
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* No children except <annotation> expected.
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL, "(annotation?)");
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((min == 0) && (max == 0))
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the reference item and attach it to the particle.
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refer = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_ELEMENT,
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref, refNs);
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refer == NULL)
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) refer;
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->annot = annot;
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the particle to pending components, since the reference
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* need to be resolved.
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, particle);
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) particle);
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The declaration part ===============================================
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdeclaration_part:
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *ns = NULL, *fixed, *name, *attrValue;
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCPtr curIDC = NULL, lastIDC = NULL;
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(ctxt, NULL, nameAttr,
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0)
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Evaluate the target namespace.
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (topLevel) {
8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ns = ctxt->targetNamespace;
8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNode(node, "form");
8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr != NULL) {
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attrValue, BAD_CAST "qualified")) {
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = ctxt->targetNamespace;
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (!xmlStrEqual(attrValue, BAD_CAST "unqualified")) {
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(ctxt,
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(qualified | unqualified)",
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ns = ctxt->targetNamespace;
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl = xmlSchemaAddElement(ctxt, name, ns, node, topLevel);
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl == NULL) {
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto return_null;
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "type")) &&
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "default")) &&
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "fixed")) &&
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "block")) &&
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "nillable")))
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (topLevel == 0) {
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (!xmlStrEqual(attr->name, BAD_CAST "form")))
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPIllegalAttrErr(ctxt,
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if ((!xmlStrEqual(attr->name, BAD_CAST "final")) &&
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->name, BAD_CAST "abstract")) &&
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(!xmlStrEqual(attr->name, BAD_CAST "substitutionGroup"))) {
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Extract/validate attributes.
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (topLevel) {
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process top attributes of global element declarations here.
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_GLOBAL;
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_TOPLEVEL;
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrQName(ctxt, schema,
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "substitutionGroup",
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(decl->substGroupNs), &(decl->substGroup));
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlGetBooleanProp(ctxt, node, "abstract", 0))
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_ABSTRACT;
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Attribute "final".
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = xmlSchemaGetPropNode(node, "final");
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr == NULL) {
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_EXTENSION;
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    decl->flags |= XML_SCHEMAS_ELEM_FINAL_RESTRICTION;
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    -1,
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ELEM_FINAL_EXTENSION,
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ELEM_FINAL_RESTRICTION, -1, -1, -1) != 0) {
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPSimpleTypeErr(ctxt,
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr,
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, "(#all | List of (extension | restriction))",
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attrValue, NULL, NULL, NULL);
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "block".
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "block");
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Apply default "block" values.
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_RESTRICTION;
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_EXTENSION;
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION;
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(decl->flags),
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1,
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_EXTENSION,
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_RESTRICTION,
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION, -1, -1) != 0) {
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, (xmlNodePtr) attr,
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, "(#all | List of (extension | "
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "restriction | substitution))", attrValue,
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL, NULL);
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlGetBooleanProp(ctxt, node, "nillable", 0))
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->flags |= XML_SCHEMAS_ELEM_NILLABLE;
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "type");
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr != NULL) {
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPValAttrNodeQName(ctxt, schema,
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(decl->namedTypeNs), &(decl->namedType));
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCheckReference(ctxt, schema, node,
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr, decl->namedTypeNs);
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl->value = xmlSchemaGetProp(ctxt, node, "default");
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "fixed");
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr != NULL) {
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->value != NULL) {
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 3.3.3 : 1
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* default and fixed must not both be present.
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPMutualExclAttrErr(ctxt,
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_1,
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, attr, "default", "fixed");
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->flags |= XML_SCHEMAS_ELEM_FIXED;
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->value = fixed;
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* And now for the children...
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "complexType")) {
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.3 : 3
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "type" and either <simpleType> or <complexType> are mutually
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * exclusive
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->namedType != NULL) {
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_3,
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'type' and the <complexType> child are "
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseComplexType(ctxt, schema, child, 0);
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "simpleType")) {
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.3 : 3
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "type" and either <simpleType> or <complexType> are
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * mutually exclusive
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (decl->namedType != NULL) {
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_ELEMENT_3,
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'type' and the <simpleType> child are "
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(decl) = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "unique")) ||
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "key")) || (IS_SCHEMA(child, "keyref"))) {
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "unique")) {
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_UNIQUE, decl->targetNamespace);
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "key")) {
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_KEY, decl->targetNamespace);
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "keyref")) {
8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curIDC = xmlSchemaParseIDC(ctxt, schema, child,
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_IDC_KEYREF, decl->targetNamespace);
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lastIDC != NULL)
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastIDC->next = curIDC;
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		decl->idcs = (void *) curIDC;
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastIDC = curIDC;
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "(annotation?, ((simpleType | complexType)?, "
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(unique | key | keyref)*))");
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl->annot = annot;
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Element Declaration Representation OK 4. will be checked at a
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * different layer.
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des)
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel)
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) decl);
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) decl;
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaBasicItemPtr) particle);
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectreturn_null:
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    FREE_AND_NULL(des);
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (annot != NULL) {
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle != NULL)
8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->annot = NULL;
8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl != NULL)
8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    decl->annot = NULL;
8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeAnnot(annot);
8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseUnion:
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Union definition
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of internal error, 0 in case of success and a positive
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code otherwise.
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseUnion(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr node)
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur = NULL;
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mark the simple type as being of variety "union".
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
885160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the �simple ur-type definition�."
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "memberTypes"))) {
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "memberTypes". This is a list of QNames.
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Check the value to contain anything.
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "memberTypes");
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *end;
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *tmp;
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *localName, *nsName;
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr link, lastLink = NULL;
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref;
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->base = cur;
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
8888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
8889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
8890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
8891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlStrndup(cur, end - cur);
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrNodeQNameValue(ctxt, schema,
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr, BAD_CAST tmp, &nsName, &localName) == 0) {
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the member type link.
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link = (xmlSchemaTypeLinkPtr)
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlMalloc(sizeof(xmlSchemaTypeLink));
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (link == NULL) {
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPErrMemory(ctxt, "xmlSchemaParseUnion, "
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating a type link", NULL);
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = NULL;
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->next = NULL;
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastLink == NULL)
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->memberTypes = link;
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastLink->next = link;
8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastLink = link;
8914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a reference item.
8916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref = xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_SIMPLE,
8918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    localName, nsName);
8919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ref == NULL) {
8920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(tmp)
8921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
8922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
8924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Assign the reference to the link, it will be resolved
8925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* later during fixup of the union simple type.
8926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
8927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = (xmlSchemaTypePtr) ref;
8928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(tmp)
8930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
8931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
8932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
8936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the simple type ancestor.
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr subtype, last = NULL;
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Anchor the member types in the "subtypes" field of the
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* simple type.
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "simpleType")) {
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    subtype = (xmlSchemaTypePtr)
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (subtype != NULL) {
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL) {
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes = subtype;
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = subtype;
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = subtype;
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last = subtype;
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last->next = NULL;
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
8971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
8972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL, "(annotation?, simpleType*)");
8973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attr == NULL) && (type->subtypes == NULL)) {
8975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 /*
8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-union-memberTypes-or-simpleTypes
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Either the memberTypes [attribute] of the <union> element must
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* be non-empty or there must be at least one simpleType [child].
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_UNION_MEMBERTYPES_OR_SIMPLETYPES,
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'memberTypes' or "
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "at least one <simpleType> child must be present", NULL);
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseList:
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema List definition
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseList(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlNodePtr node)
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mark the type as being of variety "list".
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (Base type) (2) "If the <list> or <union> alternative is chosen,
901960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the �simple ur-type definition�."
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "itemType"))) {
9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "itemType". NOTE that we will use the "ref" and "refNs"
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * fields for holding the reference to the itemType.
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REVAMP TODO: Use the "base" and "baseNs" fields, since we will remove
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the "ref" fields.
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrQName(ctxt, schema, NULL,
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, "itemType", &(type->baseNs), &(type->base));
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleType")) {
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-list-itemType-or-simpleType
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Either the itemType [attribute] or the <simpleType> [child] of
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the <list> element must be present, but not both.
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->base != NULL) {
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'itemType' and the <simpleType> child "
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"are mutually exclusive", NULL);
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = xmlSchemaParseSimpleType(ctxt, schema, child, 0);
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type->base == NULL) {
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'itemType' or the <simpleType> child "
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "must be present", NULL);
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL, "(annotation?, simpleType?)");
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->base == NULL) &&
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->subtypes == NULL) &&
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaGetPropNode(node, "itemType") == NULL)) {
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Either the attribute 'itemType' or the <simpleType> child "
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "must be present", NULL);
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSimpleType:
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Simple Type definition
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 in case of success.
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSimpleType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr node, int topLevel)
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type, oldCtxtType;
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue = NULL;
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int hasRestriction = 0;
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"name", NULL);
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrNode(ctxt,
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, attr,
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &attrValue) != 0)
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip built-in types.
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ctxt->isS4S) {
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr biType;
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->isRedefine) {
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * REDEFINE: Disallow redefinition of built-in-types.
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: It seems that the spec does not say anything
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * about this case.
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, node,
9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Redefinition of built-in simple types is not "
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"supported", NULL);
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(NULL);
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		biType = xmlSchemaGetPredefinedType(attrValue, xmlSchemaNs);
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (biType != NULL)
9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (biType);
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TargetNamespace:
916460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "The �actual value� of the targetNamespace [attribute]
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the <schema> ancestor element information item if present,
916660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * otherwise �absent�.
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel == 0) {
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        char buf[40];
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as local simple type definition.
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(buf, 39, "#ST%d", ctxt->counter++ + 1);
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE,
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->targetNamespace, node, 0);
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE,
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ctxt->targetNamespace, node, 0);
9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_SIMPLE;
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
919860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as global simple type definition.
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that attrValue is the value of the attribute "name" here.
9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema, XML_SCHEMA_TYPE_SIMPLE,
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue, ctxt->targetNamespace, node, 1);
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_SIMPLE;
9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "name")) &&
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "final"))) {
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute "final".
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "final");
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_LIST;
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->flags |= XML_SCHEMAS_TYPE_FINAL_UNION;
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attrValue = xmlSchemaGetProp(ctxt, node, "final");
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, -1, XML_SCHEMAS_TYPE_FINAL_RESTRICTION, -1,
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_LIST,
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_UNION) != 0) {
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSimpleTypeErr(ctxt,
9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, (xmlNodePtr) attr,
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, "(#all | List of (list | union | restriction)",
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue, NULL, NULL, NULL);
9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->targetNamespace = ctxt->targetNamespace;
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldCtxtType = ctxt->ctxtType;
926960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = type;
927160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_MISSING,
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | list | union))");
928160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (IS_SCHEMA(child, "restriction")) {
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
928360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    XML_SCHEMA_TYPE_SIMPLE);
928460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	hasRestriction = 1;
9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "list")) {
9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseList(ctxt, schema, child);
9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "union")) {
9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseUnion(ctxt, schema, child);
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt, XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | list | union))");
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REDEFINE: SPEC src-redefine (5)
9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "Within the [children], each <simpleType> must have a
930160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * <restriction> among its [children] ... the �actual value� of whose
930260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * base [attribute] must be the same as the �actual value� of its own
9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * name attribute plus target namespace;"
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel && ctxt->isRedefine && (! hasRestriction)) {
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "This is a redefinition, thus the "
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "<simpleType> must have a <restriction> child", NULL);
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
931060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = oldCtxtType;
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (type);
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroupDefRef:
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the schema being built
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a reference to a model group definition.
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * We will return a particle component with a qname-component or
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of an error.
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroupDefRef(xmlSchemaParserCtxtPtr ctxt,
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaPtr schema,
9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlNodePtr node)
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr item;
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *ref = NULL, *refNs = NULL;
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min, max;
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "ref");
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "ref", NULL);
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNodeQName(ctxt, schema, NULL,
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr, &refNs, &ref) != 0) {
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckReference(ctxt, schema, node, attr, refNs);
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"(xs:nonNegativeInteger | unbounded)");
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "ref")) &&
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id")) &&
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "minOccurs")) &&
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "maxOccurs"))) {
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddParticle(ctxt, node, min, max);
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
937660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return (NULL);
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a qname-reference and set as the term; it will be substituted
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for the model group after the reference has been resolved.
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item->children = (xmlSchemaTreeItemPtr)
938260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaNewQNameRef(ctxt, XML_SCHEMA_TYPE_GROUP, ref, refNs);
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCheckParticleCorrect_2(ctxt, item, node, min, max);
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Is annotation even allowed for a model group reference? */
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: What to do exactly with the annotation?
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Corresponds to no component at all if minOccurs==maxOccurs==0.
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((min == 0) && (max == 0))
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ((xmlSchemaTreeItemPtr) item);
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroupDefinition:
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses a XML schema model group definition.
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note that the contraint src-redefine (6.2) can't be applied until
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * references have been resolved. So we will do this at the
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * component fixup level.
942260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaModelGroupDefPtr
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroupDefinition(xmlSchemaParserCtxtPtr ctxt,
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaPtr schema,
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr node)
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr item;
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "name");
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "name", NULL);
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddModelGroupDefinition(ctxt, schema, name,
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->targetNamespace, node);
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "name")) &&
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "id"))) {
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "all")) {
9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ALL, 0);
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "choice")) {
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_CHOICE, 0);
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "sequence")) {
9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->children = xmlSchemaParseModelGroup(ctxt, schema, child,
9492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SEQUENCE, 0);
9493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
949660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (all | choice | sequence)?)");
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (item);
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCleanupDoc:
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the root of the document.
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * removes unwanted nodes in a schemas document tree
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCleanupDoc(xmlSchemaParserCtxtPtr ctxt, xmlNodePtr root)
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr delete, cur;
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (root == NULL)) return;
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Remove all the blank text nodes
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    delete = NULL;
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = root;
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (delete != NULL) {
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(delete);
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(delete);
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = NULL;
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_TEXT_NODE) {
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (IS_BLANK_NODE(cur)) {
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlNodeGetSpacePreserve(cur) != 1) {
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type != XML_ELEMENT_NODE) &&
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type != XML_CDATA_SECTION_NODE)) {
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = cur;
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto skip_children;
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Skip to next node
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->children != NULL) {
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->children->type != XML_ENTITY_DECL) &&
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_REF_NODE) &&
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_NODE)) {
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->children;
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip_children:
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == root) {
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = NULL;
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (delete != NULL) {
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlUnlinkNode(delete);
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNode(delete);
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        delete = NULL;
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearSchemaDefaults(xmlSchemaPtr schema)
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_QUALIF_ELEM)
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_QUALIF_ELEM;
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_QUALIF_ATTR)
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_QUALIF_ATTR;
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_EXTENSION;
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION;
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_LIST)
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_LIST;
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_UNION)
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_FINAL_DEFAULT_UNION;
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION;
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION;
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION)
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schema->flags ^= XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION;
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSchemaElement(xmlSchemaParserCtxtPtr ctxt,
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaPtr schema,
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node)
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *val;
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, oldErrs = ctxt->nberrors;
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Those flags should be moved to the parser context flags,
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * since they are not visible at the component level. I.e.
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * they are used if processing schema *documents* only.
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE;
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Since the version is of type xs:token, we won't bother to
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * check it.
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* REMOVED:
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "version");
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrNode(ctxt, NULL, NULL, attr,
963460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaGetBuiltInType(XML_SCHEMAS_TOKEN), &val);
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "targetNamespace");
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrNode(ctxt, NULL, attr,
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI), NULL);
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->stop = XML_SCHEMAP_S4S_ATTR_INVALID_VALUE;
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "elementFormDefault");
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_QUALIF_ELEM);
9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_ELEMFORMDEFAULT_VALUE,
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(qualified | unqualified)", val, NULL, NULL, NULL);
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "attributeFormDefault");
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrFormDefault(val, &schema->flags,
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_QUALIF_ATTR);
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_ATTRFORMDEFAULT_VALUE,
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(qualified | unqualified)", val, NULL, NULL, NULL);
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "finalDefault");
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_EXTENSION,
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION,
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1,
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_LIST,
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_FINAL_DEFAULT_UNION);
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(#all | List of (extension | restriction | list | union))",
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "blockDefault");
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
969460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	val = xmlSchemaGetNodeContent(ctxt, (xmlNodePtr) attr);
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaPValAttrBlockFinal(val, &(schema->flags), -1,
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION,
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION,
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_BLOCK_DEFAULT_SUBSTITUTION, -1, -1);
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE;
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSimpleTypeErr(ctxt,
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, (xmlNodePtr) attr, NULL,
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(#all | List of (extension | restriction | substitution))",
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		val, NULL, NULL, NULL);
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldErrs != ctxt->nberrors)
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = ctxt->err;
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSchemaTopLevel:
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schemas
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  the list of top level nodes
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML Schema structure built from the resource or
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSchemaTopLevel(xmlSchemaParserCtxtPtr ctxt,
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlSchemaPtr schema, xmlNodePtr nodes)
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAnnotPtr annot;
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, oldErrs, tmpOldErrs;
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (nodes == NULL))
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldErrs = ctxt->nberrors;
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = nodes;
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((IS_SCHEMA(child, "include")) ||
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "import")) ||
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "redefine")) ||
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (IS_SCHEMA(child, "annotation"))) {
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->annot == NULL)
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->annot = annot;
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeAnnot(annot);
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "import")) {
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseImport(ctxt, schema, child);
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
975560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		goto exit;
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "include")) {
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseInclude(ctxt, schema, child);
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
976260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		goto exit;
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "redefine")) {
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpOldErrs = ctxt->nberrors;
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaParseRedefine(ctxt, schema, child);
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE;
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HSTOP(ctxt);
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpOldErrs != ctxt->nberrors)
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	child = child->next;
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: Change the functions to return int results.
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We need especially to catch internal errors.
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "complexType")) {
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseComplexType(ctxt, schema, child, 1);
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "simpleType")) {
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseSimpleType(ctxt, schema, child, 1);
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "element")) {
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseElement(ctxt, schema, child, NULL, 1);
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "attribute")) {
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseGlobalAttribute(ctxt, schema, child);
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "attributeGroup")) {
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAttributeGroupDefinition(ctxt, schema, child);
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "group")) {
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseModelGroupDefinition(ctxt, schema, child);
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "notation")) {
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseNotation(ctxt, schema, child);
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, child->parent, child,
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, "((include | import | redefine | annotation)*, "
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(((simpleType | complexType | group | attributeGroup) "
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"| element | attribute | notation), annotation*)*)");
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "annotation")) {
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: We should add all annotations.
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    annot = xmlSchemaParseAnnotation(ctxt, child, 1);
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schema->annot == NULL)
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->annot = annot;
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeAnnot(annot);
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = NULL;
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (oldErrs != ctxt->nberrors)
9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = ctxt->err;
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaSchemaRelationPtr
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationCreate(void)
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr ret;
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSchemaRelationPtr)
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaSchemaRelation));
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL, "allocating schema relation", NULL);
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSchemaRelation));
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationFree(xmlSchemaSchemaRelationPtr rel)
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(rel);
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaRedefListFree(xmlSchemaRedefPtr redef)
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr prev;
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (redef != NULL) {
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = redef;
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	redef = redef->next;
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prev);
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaConstructionCtxtFree(xmlSchemaConstructionCtxtPtr con)
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * After the construction context has been freed, there will be
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * no schema graph available any more. Only the schema buckets
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * will stay alive, which are put into the "schemasImports" and
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "includes" slots of the xmlSchema.
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->buckets != NULL)
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(con->buckets);
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->pending != NULL)
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(con->pending);
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->substGroups != NULL)
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(con->substGroups,
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->redefs != NULL)
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaRedefListFree(con->redefs);
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->dict != NULL)
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictFree(con->dict);
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(con);
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
988760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottstatic xmlSchemaConstructionCtxtPtr
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaConstructionCtxtCreate(xmlDictPtr dict)
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaConstructionCtxtPtr ret;
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaConstructionCtxtPtr)
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaConstructionCtxt));
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(NULL,
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating schema construction context", NULL);
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaConstructionCtxt));
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buckets = xmlSchemaItemListCreate();
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->buckets == NULL) {
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating list of schema buckets", NULL);
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->pending = xmlSchemaItemListCreate();
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->pending == NULL) {
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErrMemory(NULL,
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating list of pending global components", NULL);
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ret);
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = dict;
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictReference(dict);
9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParserCtxtPtr
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtCreate(void)
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaParserCtxtPtr) xmlMalloc(sizeof(xmlSchemaParserCtxt));
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPErrMemory(NULL, "allocating schema parser context",
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            NULL);
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaParserCtxt));
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_CTXT_PARSER;
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->attrProhibs = xmlSchemaItemListCreate();
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->attrProhibs == NULL) {
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ret);
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewParserCtxtUseDict:
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dict: the dictionary to be used
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that file/resource expected
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaParserCtxtPtr
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewParserCtxtUseDict(const char *URL, xmlDictPtr dict)
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
995760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ret == NULL)
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = dict;
996060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlDictReference(dict);
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL != NULL)
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->URL = xmlDictLookup(dict, (const xmlChar *) URL, -1);
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCreatePCtxtOnVCtxt(xmlSchemaValidCtxtPtr vctxt)
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->pctxt == NULL) {
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (vctxt->schema != NULL)
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->pctxt =
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaNewParserCtxtUseDict("*", vctxt->schema->dict);
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->pctxt = xmlSchemaNewParserCtxt("*");
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->pctxt == NULL) {
9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaCreatePCtxtOnVCtxt",
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to create a temp. parser context");
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Pass user data. */
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserErrors(vctxt->pctxt, vctxt->error,
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->warning, vctxt->errCtxt);
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserStructuredErrors(vctxt->pctxt, vctxt->serror,
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->errCtxt);
9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetSchemaBucket:
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the schema parser context
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schemaLocation: the URI of the schema document
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a schema bucket if it was already parsed.
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a schema bucket if it was already parsed from
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         @schemaLocation, NULL otherwise.
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *schemaLocation)
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Pointer comparison! */
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->schemaLocation == schemaLocation)
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetChameleonSchemaBucket(xmlSchemaParserCtxtPtr pctxt,
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *schemaLocation,
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar *targetNamespace)
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Pointer comparison! */
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->origTargetNamespace == NULL) &&
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->schemaLocation == schemaLocation) &&
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->targetNamespace == targetNamespace))
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BAD_SCHEMA_DOC(b) \
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (((b)->doc == NULL) && ((b)->schemaLocation != NULL))
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaBucketPtr
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetSchemaBucketByTNS(xmlSchemaParserCtxtPtr pctxt,
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar *targetNamespace,
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 int imported)
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr cur;
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr list;
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = pctxt->constructor->buckets;
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list->nbItems == 0)
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < list->nbItems; i++) {
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = (xmlSchemaBucketPtr) list->items[i];
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((! IS_BAD_SCHEMA_DOC(cur)) &&
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->origTargetNamespace == targetNamespace) &&
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((imported && cur->imported) ||
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((!imported) && (!cur->imported))))
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(cur);
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNewDocWithContext(xmlSchemaParserCtxtPtr pctxt,
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPtr schema,
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBucketPtr bucket)
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldFlags;
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr oldDoc;
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, oldErrs;
10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr oldbucket = pctxt->constructor->bucket;
1008560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1008660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save old values; reset the *main* schema.
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: This is not good; move the per-document information
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the parser. Get rid of passing the main schema to the
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * parsing functions.
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldFlags = schema->flags;
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldDoc = schema->doc;
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->flags != 0)
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearSchemaDefaults(schema);
1009660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    schema->doc = bucket->doc;
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->schema = schema;
1009860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Keep the current target namespace on the parser *not* on the
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * main schema.
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->targetNamespace = bucket->targetNamespace;
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket->targetNamespace != NULL) &&
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStrEqual(bucket->targetNamespace, xmlSchemaNs)) {
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We are parsing the schema for schemas!
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isS4S = 1;
1011160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Mark it as parsed, even if parsing fails. */
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    bucket->parsed++;
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Compile the schema doc. */
10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = xmlDocGetRootElement(bucket->doc);
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParseSchemaElement(pctxt, schema, node);
10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* An empty schema; just get out. */
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL)
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldErrs = pctxt->nberrors;
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParseSchemaTopLevel(pctxt, schema, node->children);
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Not nice, but I'm not 100% sure we will get always an error
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * as a result of the obove functions; so better rely on pctxt->err
10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * as well.
10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (oldErrs != pctxt->nberrors)) {
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = pctxt->err;
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1013560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_CONSTRUCTOR(pctxt)->bucket = oldbucket;
10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Restore schema values. */
10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema->doc = oldDoc;
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema->flags = oldFlags;
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseNewDoc(xmlSchemaParserCtxtPtr pctxt,
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPtr schema,
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaBucketPtr bucket)
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr newpctxt;
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0;
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->parsed) {
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "reparsing a schema doc");
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->doc == NULL) {
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "parsing a schema doc, but there's no doc");
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->constructor == NULL) {
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseNewDoc",
10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no constructor");
10167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1016860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create and init the temporary parser context. */
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt = xmlSchemaNewParserCtxtUseDict(
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) bucket->schemaLocation, pctxt->dict);
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (newpctxt == NULL)
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->constructor = pctxt->constructor;
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1017660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * TODO: Can we avoid that the parser knows about the main schema?
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * It would be better if he knows about the current schema bucket
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * only.
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->schema = schema;
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSetParserErrors(newpctxt, pctxt->error, pctxt->warning,
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->errCtxt);
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSetParserStructuredErrors(newpctxt, pctxt->serror,
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->errCtxt);
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    newpctxt->counter = pctxt->counter;
1018660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseNewDocWithContext(newpctxt, schema, bucket);
1018960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Channel back errors and cleanup the temporary parser context. */
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->err = res;
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->nberrors += newpctxt->nberrors;
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->counter = newpctxt->counter;
1019560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    newpctxt->constructor = NULL;
10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Free the parser context. */
10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeParserCtxt(newpctxt);
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSchemaRelationAddChild(xmlSchemaBucketPtr bucket,
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaSchemaRelationPtr rel)
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr cur = bucket->relations;
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bucket->relations = rel;
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur->next != NULL)
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->next = rel;
10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildAbsoluteURI(xmlDictPtr dict, const xmlChar* location,
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr ctxtNode)
1022060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Build an absolue location URI.
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1022460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (location != NULL) {
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxtNode == NULL)
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(location);
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *base, *URI;
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *ret = NULL;
10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    base = xmlNodeGetBase(ctxtNode->doc, ctxtNode);
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (base == NULL) {
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		URI = xmlBuildURI(location, ctxtNode->doc->URL);
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		URI = xmlBuildURI(location, base);
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(base);
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (URI != NULL) {
10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlDictLookup(dict, URI, -1);
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(URI);
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ret);
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1024760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAddSchemaDoc:
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema validation context
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parse an included (and to-be-redefined) XML schema document.
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, a positive error code on errors and
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in case of an internal or API error.
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddSchemaDoc(xmlSchemaParserCtxtPtr pctxt,
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int type, /* import or include or redefine */
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *schemaLocation,
10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlDocPtr schemaDoc,
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const char *schemaBuffer,
10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int schemaBufferLen,
10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNodePtr invokingNode,
1027060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar *sourceTargetNamespace,
1027160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		const xmlChar *importNamespace,
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketPtr *bucket)
10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *targetNamespace = NULL;
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationPtr relation = NULL;
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc = NULL;
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, err = 0, located = 0, preserveDoc = 0;
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bkt = NULL;
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket != NULL)
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*bucket = NULL;
1028260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_IMPORT:
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_MAIN:
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_IMPORT;
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_INCLUDE:
10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_INCLUDE;
10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_SCHEMA_REDEFINE:
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = XML_SCHEMAP_SRC_REDEFINE;
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1029460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
1029560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Special handling for the main schema:
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * skip the location and relation logic and just parse the doc.
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We need just a bucket to be returned in this case.
1030060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == XML_SCHEMA_SCHEMA_MAIN) || (! WXS_HAS_BUCKETS(pctxt)))
1030260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	goto doc_load;
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1030460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Note that we expect the location to be an absulute URI. */
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaLocation != NULL) {
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt = xmlSchemaGetSchemaBucket(pctxt, schemaLocation);
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bkt != NULL) &&
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (pctxt->constructor->bucket == bkt)) {
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Report self-imports/inclusions/redefinitions. */
1031060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		invokingNode, NULL,
10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema must not import/include/redefine itself",
10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a relation for the graph of schemas.
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    relation = xmlSchemaSchemaRelationCreate();
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (relation == NULL)
1032360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSchemaRelationAddChild(pctxt->constructor->bucket,
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	relation);
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    relation->type = type;
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save the namespace import information.
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
1033260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	relation->importNamespace = importNamespace;
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaLocation == NULL) {
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * No location; this is just an import of the namespace.
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that we don't assign a bucket to the relation
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * in this case.
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	targetNamespace = importNamespace;
10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Did we already fetch the doc? */
1034560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (bkt != NULL) {
10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_IS_BUCKET_IMPMAIN(type)) && (! bkt->imported)) {
10347df143a5041f03a22808b59c76698770b74692815Selim Gurun	    /*
10348df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * We included/redefined and then try to import a schema,
10349df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * but the new location provided for import was different.
10350df143a5041f03a22808b59c76698770b74692815Selim Gurun	    */
10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schemaLocation == NULL)
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation = BAD_CAST "in_memory_buffer";
10353df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (!xmlStrEqual(schemaLocation,
10354df143a5041f03a22808b59c76698770b74692815Selim Gurun		bkt->schemaLocation)) {
10355df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10356df143a5041f03a22808b59c76698770b74692815Selim Gurun		    invokingNode, NULL,
10357df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The schema document '%s' cannot be imported, since "
10358df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "it was already included or redefined",
10359df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
10360df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit;
10361df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((! WXS_IS_BUCKET_IMPMAIN(type)) && (bkt->imported)) {
10363df143a5041f03a22808b59c76698770b74692815Selim Gurun	    /*
10364df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * We imported and then try to include/redefine a schema,
10365df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * but the new location provided for the include/redefine
10366df143a5041f03a22808b59c76698770b74692815Selim Gurun	    * was different.
10367df143a5041f03a22808b59c76698770b74692815Selim Gurun	    */
10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (schemaLocation == NULL)
10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation = BAD_CAST "in_memory_buffer";
10370df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (!xmlStrEqual(schemaLocation,
10371df143a5041f03a22808b59c76698770b74692815Selim Gurun		bkt->schemaLocation)) {
10372df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt, err,
10373df143a5041f03a22808b59c76698770b74692815Selim Gurun		    invokingNode, NULL,
10374df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The schema document '%s' cannot be included or "
10375df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "redefined, since it was already imported",
10376df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
10377df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit;
10378df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
1037960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1038160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN(type)) {
10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Given that the schemaLocation [attribute] is only a hint, it is open
10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to applications to ignore all but the first <import> for a given
1038660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* namespace, regardless of the �actual value� of schemaLocation, but
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* such a strategy risks missing useful information when new
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* schemaLocations are offered.
10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We will use the first <import> that comes with a location.
10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Further <import>s *with* a location, will result in an error.
10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Better would be to just report a warning here, but
10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we'll try it this way until someone complains.
10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Schema Document Location Strategy:
10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3 Based on the namespace name, identify an existing schema document,
10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* either as a resource which is an XML document or a <schema> element
10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* information item, in some local schema repository;
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 5 Attempt to resolve the namespace name to locate such a resource.
10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: (3) and (5) are not supported.
1040260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL) {
10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt = xmlSchemaGetSchemaBucketByTNS(pctxt,
10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    importNamespace, 1);
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1041060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (bkt != NULL) {
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bkt->schemaLocation == NULL) {
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* First given location of the schema; load the doc. */
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt->schemaLocation = schemaLocation;
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(schemaLocation,
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bkt->schemaLocation)) {
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Additional location given; just skip it.
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * URGENT TODO: We should report a warning here.
10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * res = XML_SCHEMAP_SRC_IMPORT;
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (schemaLocation == NULL)
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			schemaLocation = BAD_CAST "in_memory_buffer";
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_SKIP_SCHEMA,
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			invokingNode, NULL,
10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping import of schema located at '%s' for the "
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"namespace '%s', since this namespace was already "
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"imported with the schema located at '%s'",
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			schemaLocation, importNamespace, bkt->schemaLocation);
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1043660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1043760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* No bucket + first location: load the doc and create a
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* bucket.
10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <include> and <redefine> */
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL) {
1044460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((bkt->origTargetNamespace == NULL) &&
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(bkt->targetNamespace != sourceTargetNamespace)) {
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBucketPtr chamel;
1044860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Chameleon include/redefine: skip loading only if it was
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* aleady build for the targetNamespace of the including
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* schema.
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO: If the schema is a chameleon-include then copy
10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the components into the including schema and modify the
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* targetNamespace of those components, do nothing otherwise.
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE: This is currently worked-around by compiling the
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chameleon for every destinct including targetNamespace; thus
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* not performant at the moment.
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check when the namespace in wildcards for chameleons
10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* needs to be converted: before we built wildcard intersections
10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* or after.
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   Answer: after!
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		chamel = xmlSchemaGetChameleonSchemaBucket(pctxt,
10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, sourceTargetNamespace);
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (chamel != NULL) {
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* A fitting chameleon was already parsed; NOP. */
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    relation->bucket = chamel;
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit;
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1047360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		/*
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to parse the chameleon again for a different
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* targetNamespace.
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* CHAMELEON TODO: Optimize this by only parsing the
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chameleon once, and then copying the components to
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the new targetNamespace.
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt = NULL;
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		relation->bucket = bkt;
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
1048460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bkt != NULL) && (bkt->doc != NULL)) {
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaAddSchemaDoc",
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "trying to load a schema doc, but a doc is already "
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "assigned to the schema bucket");
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdoc_load:
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Load the document.
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaDoc != NULL) {
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	doc = schemaDoc;
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Don' free this one, since it was provided by the caller. */
10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	preserveDoc = 1;
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Does the context or the doc hold the location? */
10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaDoc->URL != NULL)
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation = xmlDictLookup(pctxt->dict,
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaDoc->URL, -1);
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation = BAD_CAST "in_memory_buffer";
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((schemaLocation != NULL) || (schemaBuffer != NULL)) {
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlParserCtxtPtr parserCtxt;
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	parserCtxt = xmlNewParserCtxt();
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parserCtxt == NULL) {
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(NULL, "xmlSchemaGetDoc, "
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating a parser context", NULL);
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((pctxt->dict != NULL) && (parserCtxt->dict != NULL)) {
10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Do we have to burden the schema parser dict with all
10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the content of the schema doc?
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictFree(parserCtxt->dict);
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parserCtxt->dict = pctxt->dict;
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictReference(parserCtxt->dict);
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schemaLocation != NULL) {
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Parse from file. */
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    doc = xmlCtxtReadFile(parserCtxt, (const char *) schemaLocation,
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, SCHEMAS_PARSE_OPTIONS);
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (schemaBuffer != NULL) {
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Parse from memory buffer. */
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    doc = xmlCtxtReadMemory(parserCtxt, schemaBuffer, schemaBufferLen,
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL, SCHEMAS_PARSE_OPTIONS);
10534df143a5041f03a22808b59c76698770b74692815Selim Gurun	    schemaLocation = BAD_CAST "in_memory_buffer";
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (doc != NULL)
10536df143a5041f03a22808b59c76698770b74692815Selim Gurun		doc->URL = xmlStrdup(schemaLocation);
10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For <import>:
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.1 The referent is (a fragment of) a resource which is an
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML document (see clause 1.1), which in turn corresponds to
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a <schema> element information item in a well-formed information
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* set, which in turn corresponds to a valid schema.
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: (2.1) fragments of XML documents are not supported.
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.2 The referent is a <schema> element information item in
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* a well-formed information set, which in turn corresponds
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to a valid schema.
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: (2.2) is not supported.
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (doc == NULL) {
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlErrorPtr lerr;
10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lerr = xmlGetLastError();
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check if this a parser error, or if the document could
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * just not be located.
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Try to find specific error codes to react only on
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * localisation failures.
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((lerr == NULL) || (lerr->domain != XML_FROM_IO)) {
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We assume a parser error here.
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		located = 1;
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Error code ?? */
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = XML_SCHEMAP_SRC_IMPORT_2_1;
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    invokingNode, NULL,
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Failed to parse the XML resource '%s'",
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, NULL);
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeParserCtxt(parserCtxt);
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((doc == NULL) && located)
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(pctxt, NULL,
10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NOTHING_TO_PARSE,
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No information for parsing was provided with the "
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "given schema parser context.\n",
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Preprocess the document.
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc != NULL) {
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr docElem = NULL;
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1059060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	located = 1;
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	docElem = xmlDocGetRootElement(doc);
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (docElem == NULL) {
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOROOT,
1059460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		invokingNode, NULL,
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The document '%s' has no document element",
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Remove all the blank text nodes.
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCleanupDoc(pctxt, docElem);
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check the schema's top level element.
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!IS_SCHEMA(docElem, "schema")) {
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, XML_SCHEMAP_NOT_SCHEMA,
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		invokingNode, NULL,
10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The XML document '%s' is not a schema document",
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1061360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we don't apply a type check for the
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace value here.
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	targetNamespace = xmlSchemaGetProp(pctxt, docElem,
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "targetNamespace");
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1062060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* after_doc_loading: */
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bkt == NULL) && located) {
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Only create a bucket if the schema was located. */
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        bkt = xmlSchemaBucketCreate(pctxt, type,
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    targetNamespace);
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt == NULL)
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bkt != NULL) {
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt->schemaLocation = schemaLocation;
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bkt->located = located;
10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (doc != NULL) {
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = doc;
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->targetNamespace = targetNamespace;
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->origTargetNamespace = targetNamespace;
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (preserveDoc)
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bkt->preserveDoc = 1;
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_BUCKET_IMPMAIN(type))
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->imported++;
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add it to the graph of schemas.
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (relation != NULL)
10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    relation->bucket = bkt;
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1064760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Return the bucket explicitely; this is needed for the
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * main schema.
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket != NULL)
1065460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*bucket = bkt;
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((doc != NULL) && (! preserveDoc)) {
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(doc);
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL)
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = NULL;
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((doc != NULL) && (! preserveDoc)) {
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeDoc(doc);
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bkt != NULL)
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bkt->doc = NULL;
1067060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseImport:
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Import definition
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, a positive error code if
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * not valid and -1 in case of an internal error.
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseImport(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlNodePtr node)
10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *namespaceName = NULL, *schemaLocation = NULL;
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *thisTargetNamespace;
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "namespace")) &&
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttr(pctxt, NULL, node,
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"namespace", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&namespaceName) != 0) {
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, namespaceName, NULL, NULL, NULL);
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (pctxt->err);
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttr(pctxt, NULL, node,
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"schemaLocation", xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&schemaLocation) != 0) {
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSimpleTypeErr(pctxt,
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node,
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, namespaceName, NULL, NULL, NULL);
10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (pctxt->err);
10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * the annotation here is simply discarded ...
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * TODO: really?
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(pctxt,
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?)");
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply additional constraints.
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that it is important to use the original @targetNamespace
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (or none at all), to rule out imports of schemas _with_ a
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @targetNamespace if the importing schema is a chameleon schema
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (with no @targetNamespace).
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    thisTargetNamespace = WXS_BUCKET(pctxt)->origTargetNamespace;
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (namespaceName != NULL) {
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1077060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 1.1 If the namespace [attribute] is present, then its �actual value�
1077160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* must not match the �actual value� of the enclosing <schema>'s
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace [attribute].
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(thisTargetNamespace, namespaceName)) {
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_IMPORT_1_1,
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the attribute 'namespace' must not match "
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the target namespace '%s' of the importing schema",
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		thisTargetNamespace);
10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (pctxt->err);
10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.2 If the namespace [attribute] is not present, then the enclosing
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <schema> must have a targetNamespace [attribute].
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (thisTargetNamespace == NULL) {
10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_IMPORT_1_2,
10791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute 'namespace' must be existent if "
10793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the importing schema has no target namespace",
10794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
10795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (pctxt->err);
10796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Locate and acquire the schema document.
10800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schemaLocation != NULL)
10802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schemaLocation = xmlSchemaBuildAbsoluteURI(pctxt->dict,
10803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schemaLocation, node);
10804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
10805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	schemaLocation, NULL, NULL, 0, node, thisTargetNamespace,
10806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	namespaceName, &bucket);
10807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
10810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For <import>: "It is *not* an error for the application
10813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schema reference strategy to fail."
10814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * So just don't parse if no schema document was found.
10815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we will get no bucket if the schema could not be
10816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * located or if there was no schemaLocation.
10817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) && (schemaLocation != NULL)) {
10819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomWarning(ACTXT_CAST pctxt,
10820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_WARN_UNLOCATED_SCHEMA,
10821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node, NULL,
10822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Failed to locate a schema at location '%s'. "
10823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Skipping the import", schemaLocation, NULL, NULL);
10824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1082560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1082660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((bucket != NULL) && CAN_PARSE_SCHEMA(bucket)) {
10827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaParseNewDoc(pctxt, schema, bucket);
10828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1082960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIncludeOrRedefineAttrs(xmlSchemaParserCtxtPtr pctxt,
10835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaPtr schema,
10836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlNodePtr node,
10837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlChar **schemaLocation,
10838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     int type)
10839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
10841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL) ||
10843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(schemaLocation == NULL))
10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *schemaLocation = NULL;
10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Applies for both <include> and <redefine>.
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "schemaLocation"))) {
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(pctxt,
10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(pctxt,
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(pctxt, node, BAD_CAST "id");
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Preliminary step, extract the URI-Reference and make an URI
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * from the base.
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "schemaLocation" is mandatory.
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetPropNode(node, "schemaLocation");
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr != NULL) {
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlChar *base = NULL;
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlChar *uri = NULL;
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaPValAttrNode(pctxt, NULL, attr,
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYURI),
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (const xmlChar **) schemaLocation) != 0)
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_error;
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	base = xmlNodeGetBase(node->doc, node);
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base == NULL) {
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    uri = xmlBuildURI(*schemaLocation, node->doc->URL);
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    uri = xmlBuildURI(*schemaLocation, base);
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(base);
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uri == NULL) {
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaParseIncludeOrRedefine",
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"could not build an URI from the schemaLocation")
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*schemaLocation) = (xmlChar *) xmlDictLookup(pctxt->dict, uri, -1);
10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(uri);
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(pctxt,
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "schemaLocation", NULL);
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Report self-inclusion and self-redefinition.
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(*schemaLocation, pctxt->URL)) {
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE,
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema document '%s' cannot redefine itself.",
1091160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*schemaLocation);
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_INCLUDE,
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node,
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The schema document '%s' cannot include itself.",
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*schemaLocation);
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1092160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseIncludeOrRedefine(xmlSchemaParserCtxtPtr pctxt,
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPtr schema,
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlNodePtr node,
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				int type)
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *schemaLocation = NULL;
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0; /* hasRedefinitions = 0 */
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int isChameleon = 0, wasChameleon = 0;
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((pctxt == NULL) || (schema == NULL) || (node == NULL))
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse attributes. Note that the returned schemaLocation will
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be already converted to an absolute URI.
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefineAttrs(pctxt, schema,
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	node, (xmlChar **) (&schemaLocation), type);
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
1095160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(res);
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Load and add the schema document.
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaAddSchemaDoc(pctxt, type, schemaLocation, NULL,
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, 0, node, pctxt->targetNamespace, NULL, &bucket);
10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
1095860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(res);
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If we get no schema bucket back, then this means that the schema
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * document could not be located or was broken XML or was not
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a schema document.
1096360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (bucket->doc == NULL)) {
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_INCLUDE) {
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * WARNING for <include>:
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will raise an error if the schema cannot be located
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * for inclusions, since the that was the feedback from the
10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schema people. I.e. the following spec piece will *not* be
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * satisfied:
1097260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * SPEC src-include: "It is not an error for the �actual value� of the
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schemaLocation [attribute] to fail to resolve it all, in which
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * case no corresponding inclusion is performed.
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * So do we need a warning report here?"
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = XML_SCHEMAP_SRC_INCLUDE;
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to load the document '%s' for inclusion",
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: This was changed to raise an error even if no redefinitions
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are specified.
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-redefine (1)
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If there are any element information items among the [children]
1098960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * other than <annotation> then the �actual value� of the
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * schemaLocation [attribute] must successfully resolve."
10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Ask the WG if a the location has always to resolve
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * here as well!
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = XML_SCHEMAP_SRC_REDEFINE;
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt, res,
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to load the document '%s' for redefinition",
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schemaLocation, NULL);
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check targetNamespace sanity before parsing the new schema.
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Note that we won't check further content if the
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* targetNamespace was bad.
1100560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
1100660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (bucket->origTargetNamespace != NULL) {
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-include (2.1)
1100960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "SII has a targetNamespace [attribute], and its �actual
1101060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * value� is identical to the �actual value� of the targetNamespace
1101160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * [attribute] of SII� (which must have such an [attribute])."
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pctxt->targetNamespace == NULL) {
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_INCLUDE,
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    node, NULL,
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The target namespace of the included/redefined schema "
11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'%s' has to be absent, since the including/redefining "
11019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "schema has no target namespace",
11020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schemaLocation, NULL);
11021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_error;
11022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (!xmlStrEqual(bucket->origTargetNamespace,
11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->targetNamespace)) {
11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Change error function. */
11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(pctxt,
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_INCLUDE,
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node,
11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The target namespace '%s' of the included/redefined "
11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "schema '%s' differs from '%s' of the "
11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "including/redefining schema",
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bucket->origTargetNamespace, schemaLocation,
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->targetNamespace);
11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_error;
11034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1103560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (pctxt->targetNamespace != NULL) {
11036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Chameleons: the original target namespace will
11038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * differ from the resulting namespace.
11039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    isChameleon = 1;
11041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bucket->parsed &&
11042df143a5041f03a22808b59c76698770b74692815Selim Gurun		bucket->origTargetNamespace != NULL) {
11043df143a5041f03a22808b59c76698770b74692815Selim Gurun		xmlSchemaCustomErr(ACTXT_CAST pctxt,
11044df143a5041f03a22808b59c76698770b74692815Selim Gurun		    XML_SCHEMAP_SRC_INCLUDE,
11045df143a5041f03a22808b59c76698770b74692815Selim Gurun		    node, NULL,
11046df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "The target namespace of the included/redefined schema "
11047df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "'%s' has to be absent or the same as the "
11048df143a5041f03a22808b59c76698770b74692815Selim Gurun		    "including/redefining schema's target namespace",
11049df143a5041f03a22808b59c76698770b74692815Selim Gurun		    schemaLocation, NULL);
11050df143a5041f03a22808b59c76698770b74692815Selim Gurun		goto exit_error;
11051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bucket->targetNamespace = pctxt->targetNamespace;
11053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1105460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the schema.
1105760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
11058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket && (!bucket->parsed) && (bucket->doc != NULL)) {
11059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isChameleon) {
11060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: Get rid of this flag on the schema itself. */
11061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((schema->flags & XML_SCHEMAS_INCLUDING_CONVERT_NS) == 0) {
11062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema->flags |= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
11064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		wasChameleon = 1;
11065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParseNewDoc(pctxt, schema, bucket);
11067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Restore chameleon flag. */
11068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (isChameleon && (!wasChameleon))
11069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schema->flags ^= XML_SCHEMAS_INCLUDING_CONVERT_NS;
11070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1107460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    child = node->children;
1107560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
11076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse (simpleType | complexType | group | attributeGroup))*
11078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefined = bucket;
11080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* How to proceed if the redefined schema was not located?
11082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isRedefine = 1;
11084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "annotation") ||
11085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "simpleType") ||
11086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "complexType") ||
11087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "group") ||
11088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    IS_SCHEMA(child, "attributeGroup")) {
11089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "annotation")) {
11090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: discard or not?
11092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "simpleType")) {
11094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(pctxt, schema, child, 1);
11095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "complexType")) {
11096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseComplexType(pctxt, schema, child, 1);
11097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
1109860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    } else if (IS_SCHEMA(child, "group")) {
11099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
11100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefinition(pctxt,
11101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schema, child);
11102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "attributeGroup")) {
11103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* hasRedefinitions = 1; */
11104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAttributeGroupDefinition(pctxt, schema,
11105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child);
11106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->redefined = NULL;
11110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->isRedefine = 0;
11111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "annotation")) {
11113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: discard or not?
11115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1111860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED;
11121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_SCHEMA_REDEFINE) {
11122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(pctxt, res,
11123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation | (simpleType | complexType | group | attributeGroup))*");
11125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPContentErr(pctxt, res,
11127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?)");
1112960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1113060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
11131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(res);
11132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
11134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
11135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseRedefine(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
11139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
11140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
11142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifndef ENABLE_REDEFINE
11143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
11144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
11146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
11147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_SCHEMA_REDEFINE);
11148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
11149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
11150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseInclude(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema,
11155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlNodePtr node)
11156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
11158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaParseIncludeOrRedefine(pctxt, schema, node,
11160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_SCHEMA_INCLUDE);
11161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
11162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(res);
11163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
11164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseModelGroup:
11168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the "compositor" type
11172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particleNeeded: if a a model group with a particle
11173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Sequence definition.
11175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies parts of:
11176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Schema Representation Constraint:
11177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     Redefinition Constraints and Semantics (src-redefine)
11178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (6.1), (6.1.1), (6.1.2)
11179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1118060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *   Schema Component Constraint:
11181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     All Group Limited (cos-all-limited) (2)
11182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     TODO: Actually this should go to component-level checks,
11183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     but is done here due to performance. Move it to an other layer
11184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     is schema construction via an API is implemented.
11185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error, 0 if the declaration is improper and
11189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         1 in case of success.
11190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
11192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlNodePtr node, xmlSchemaTypeType type,
11194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int withParticle)
11195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr item;
11197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = NULL;
11198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int min = 1, max = 1, isElemRef, hasRefs = 0;
11201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a model group with the given compositor.
11206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item = xmlSchemaAddModelGroup(ctxt, schema, type, node);
11208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item == NULL)
11209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
11210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (withParticle) {
11212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == XML_SCHEMA_TYPE_ALL) {
11213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    min = xmlGetMinOccurs(ctxt, node, 0, 1, 1, "(0 | 1)");
11214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = xmlGetMaxOccurs(ctxt, node, 1, 1, 1, "1");
11215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* choice + sequence */
11217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    min = xmlGetMinOccurs(ctxt, node, 0, -1, 1, "xs:nonNegativeInteger");
11218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    max = xmlGetMaxOccurs(ctxt, node, 0, UNBOUNDED, 1,
11219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(xs:nonNegativeInteger | unbounded)");
11220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCheckParticleCorrect_2(ctxt, NULL, node, min, max);
11222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a particle
11224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = xmlSchemaAddParticle(ctxt, node, min, max);
11226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle == NULL)
11227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
11228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = (xmlSchemaTreeItemPtr) item;
11229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
11231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
11233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
11234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
11235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
11236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "maxOccurs")) &&
11237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (!xmlStrEqual(attr->name, BAD_CAST "minOccurs"))) {
11238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
11239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
11246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check for illegal attributes.
11250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = node->properties;
11252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (attr != NULL) {
11253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->ns == NULL) {
11254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!xmlStrEqual(attr->name, BAD_CAST "id")) {
11255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalAttrErr(ctxt,
11256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = attr->next;
11263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
11268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        item->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
11276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == XML_SCHEMA_TYPE_ALL) {
11279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part, last = NULL;
11280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_SCHEMA(child, "element")) {
11282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) xmlSchemaParseElement(ctxt,
11283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		schema, child, &isElemRef, 0);
11284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC cos-all-limited (2)
11286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "The {max occurs} of all the particles in the {particles}
11287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the ('all') group must be 0 or 1.
11288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part != NULL) {
11290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (isElemRef)
11291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part->minOccurs > 1) {
11293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
11294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
11295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, child,
11296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Invalid value for minOccurs (must be 0 or 1)",
11297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
11298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Reset to 1. */
11299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part->minOccurs = 1;
11300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part->maxOccurs > 1) {
11302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
11303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
11304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, child,
11305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Invalid value for maxOccurs (must be 0 or 1)",
11306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
11307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Reset to 1. */
11308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part->maxOccurs = 1;
11309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
11311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->children = (xmlSchemaTreeItemPtr) part;
11312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = (xmlSchemaTreeItemPtr) part;
11314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = part;
11315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
11319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (annotation?, element*)");
11323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
11325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* choice + sequence */
11326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr part = NULL, last = NULL;
11327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "element")) ||
11329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "group")) ||
11330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "any")) ||
11331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "choice")) ||
11332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "sequence"))) {
11333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (IS_SCHEMA(child, "element")) {
11335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = (xmlSchemaTreeItemPtr)
11336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseElement(ctxt, schema, child, &isElemRef, 0);
11337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part && isElemRef)
11338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "group")) {
11340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part =
11341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (part != NULL)
11343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasRefs++;
11344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle redefinitions.
11346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->isRedefine && ctxt->redef &&
11348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (ctxt->redef->item->type == XML_SCHEMA_TYPE_GROUP) &&
11349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    part && part->children)
11350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
11351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((xmlSchemaGetQNameRefName(part->children) ==
11352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->redef->refName) &&
11353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaGetQNameRefTargetNs(part->children) ==
11354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ctxt->redef->refTargetNs))
11355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
11356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
11357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC src-redefine:
11358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (6.1) "If it has a <group> among its contents at
1135960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* some level the �actual value� of whose ref
1136060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* [attribute] is the same as the �actual value� of
11361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* its own name attribute plus target namespace, then
11362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* all of the following must be true:"
11363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (6.1.1) "It must have exactly one such group."
11364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
11365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ctxt->redefCounter != 0) {
11366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *str = NULL;
11367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
11369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
11370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The redefining model group definition "
11371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"'%s' must not contain more than one "
11372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"reference to the redefined definition",
11373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaFormatQName(&str,
11374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refTargetNs,
11375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refName),
11376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
11377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
11378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    part = NULL;
11379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (((WXS_PARTICLE(part))->minOccurs != 1) ||
11380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ((WXS_PARTICLE(part))->maxOccurs != 1))
11381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
11382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *str = NULL;
11383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
11384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * SPEC src-redefine:
1138560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * (6.1.2) "The �actual value� of both that
11386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * group's minOccurs and maxOccurs [attribute]
1138760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * must be 1 (or �absent�).
11388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
11389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST ctxt,
11390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_SRC_REDEFINE, child, NULL,
11391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The redefining model group definition "
11392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"'%s' must not contain a reference to the "
11393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"redefined definition with a "
11394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"maxOccurs/minOccurs other than 1",
11395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaFormatQName(&str,
11396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refTargetNs,
11397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ctxt->redef->refName),
11398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
11399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
11400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    part = NULL;
11401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
11402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->redef->reference = WXS_BASIC_CAST part;
11403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->redefCounter++;
1140460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
11405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "any")) {
11407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = (xmlSchemaTreeItemPtr)
11408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseAny(ctxt, schema, child);
11409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "choice")) {
11410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = xmlSchemaParseModelGroup(ctxt, schema, child,
11411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_CHOICE, 1);
11412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (IS_SCHEMA(child, "sequence")) {
11413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		part = xmlSchemaParseModelGroup(ctxt, schema, child,
11414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
11415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part != NULL) {
11417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (last == NULL)
11418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->children = part;
11419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    last->next = part;
11421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last = part;
11422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (child != NULL) {
11426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (element | group | choice | sequence | any)*)");
11430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((max == 0) && (min == 0))
11433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
11434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (hasRefs) {
11435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need to resolve references.
11437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_ADD_PENDING(ctxt, item);
11439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (withParticle)
1144160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return ((xmlSchemaTreeItemPtr) particle);
11442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
11443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return ((xmlSchemaTreeItemPtr) item);
11444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseRestriction:
11448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Restriction definition
11453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
11456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
11458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseRestriction(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlNodePtr node, xmlSchemaTypeType parentType)
11460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
11470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
11478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
11479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract and validate attributes.
11490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1149360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Attribute
11494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Extract the base type. The "base" attribute is mandatory if inside
11497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a complex type or if redefining.
11498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
11499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1.2) "...otherwise (<restriction> has no <simpleType> "
11500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * among its [children]), the simple type definition which is
1150160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the {content type} of the type definition �resolved� to by
1150260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the �actual value� of the base [attribute]"
11503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPValAttrQName(ctxt, schema, NULL, node, "base",
11505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&(type->baseNs), &(type->base)) == 0)
11506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
11507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->base == NULL) && (type->type == XML_SCHEMA_TYPE_COMPLEX)) {
11508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
11509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING,
11510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, "base", NULL);
11511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((ctxt->isRedefine) &&
11512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->flags & XML_SCHEMAS_TYPE_GLOBAL))
11513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
11514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->base == NULL) {
11515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPMissingAttrErr(ctxt,
11516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_MISSING,
11517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, "base", NULL);
11518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((! xmlStrEqual(type->base, type->name)) ||
11519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(! xmlStrEqual(type->baseNs, type->targetNamespace)))
11520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
11521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str1 = NULL, *str2 = NULL;
11522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* REDEFINE: SPEC src-redefine (5)
11524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "Within the [children], each <simpleType> must have a
1152560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* <restriction> among its [children] ... the �actual value� of
1152660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* whose base [attribute] must be the same as the �actual value�
11527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of its own name attribute plus target namespace;"
11528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(ctxt, XML_SCHEMAP_SRC_REDEFINE,
11530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, "This is a redefinition, but the QName "
11531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "value '%s' of the 'base' attribute does not match the "
11532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type's designation '%s'",
11533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str1, type->baseNs, type->base),
11534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str2, type->targetNamespace,
11535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->name), NULL);
11536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str1);
11537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str2);
11538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Avoid confusion and erase the values. */
11539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->base = NULL;
11540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->baseNs = NULL;
11541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1154260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
11543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the simple type ancestor.
11551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (parentType == XML_SCHEMA_TYPE_SIMPLE) {
11557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><restriction><simpleType>.
11559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "simpleType")) {
11561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->base != NULL) {
11562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
11563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* src-restriction-base-or-simpleType
11564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Either the base [attribute] or the simpleType [child] of the
11565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <restriction> element must be present, but not both.
11566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
11567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPContentErr(ctxt,
11568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
11569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, node, child,
11570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute 'base' and the <simpleType> child are "
11571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mutually exclusive", NULL);
11572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
11573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->baseType = (xmlSchemaTypePtr)
11574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaParseSimpleType(ctxt, schema, child, 0);
11575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (type->base == NULL) {
11578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESTRICTION_BASE_OR_SIMPLETYPE,
11580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child,
11581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Either the attribute 'base' or a <simpleType> child "
11582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be present", NULL);
11583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent><restriction>...
11587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* followed by:
11588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model groups <all>, <choice> and <sequence>.
11590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "all")) {
11592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
11594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL, 1);
11595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "choice")) {
11597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt,
11599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    schema, child, XML_SCHEMA_TYPE_CHOICE, 1);
11600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "sequence")) {
11602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
11604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
11605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model group reference <group>.
11608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1160960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (IS_SCHEMA(child, "group")) {
11610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
11614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
11615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent><restriction>...
11621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "1.1 the simple type definition corresponding to the <simpleType>
11623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* among the [children] of <restriction> if there is one;"
11624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "simpleType")) {
11626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will store the to-be-restricted simple type in
11628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type->contentTypeDef *temporarily*.
11629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = (xmlSchemaTypePtr)
11631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseSimpleType(ctxt, schema, child, 0);
11632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ( type->contentTypeDef == NULL)
11633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (NULL);
11634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((parentType == XML_SCHEMA_TYPE_SIMPLE) ||
11639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT)) {
11640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr facet, lastfacet = NULL;
11641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent><restriction>...
11643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <simpleType><restriction>...
11644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the facets to the simple type ancestor.
11648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Datatypes: 4.1.3 Constraints on XML Representation of
11651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Simple Type Definition Schema Representation Constraint:
11652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* *Single Facet Value*
11653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((IS_SCHEMA(child, "minInclusive")) ||
11655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "minExclusive")) ||
11656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxInclusive")) ||
11657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxExclusive")) ||
11658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "totalDigits")) ||
11659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "fractionDigits")) ||
11660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "pattern")) ||
11661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "enumeration")) ||
11662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "whiteSpace")) ||
11663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "length")) ||
11664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "maxLength")) ||
11665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (IS_SCHEMA(child, "minLength"))) {
11666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = xmlSchemaParseFacet(ctxt, schema, child);
11667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet != NULL) {
11668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastfacet == NULL)
11669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->facets = facet;
11670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastfacet->next = facet;
11672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastfacet = facet;
11673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastfacet->next = NULL;
11674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create links for derivation and validation.
11679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->facets != NULL) {
11681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetLinkPtr facetLink, lastFacetLink = NULL;
11682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = type->facets;
11684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
11685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink = (xmlSchemaFacetLinkPtr)
11686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlMalloc(sizeof(xmlSchemaFacetLink));
11687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facetLink == NULL) {
11688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPErrMemory(ctxt, "allocating a facet link", NULL);
11689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(facetLink);
11690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (NULL);
11691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
11692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink->facet = facet;
11693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink->next = NULL;
11694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (lastFacetLink == NULL)
11695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->facetSet = facetLink;
11696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
11697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastFacetLink->next = facetLink;
11698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastFacetLink = facetLink;
11699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = facet->next;
11700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (facet != NULL);
11701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_COMPLEX) {
11704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute uses/declarations.
11706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
11708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
11709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
11710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute wildcard.
11713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
11715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attributeWildcard =
11716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAnyAttribute(ctxt, schema, child);
11717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"annotation?, (group | all | choice | sequence)?, "
11726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"((attribute | attributeGroup)*, anyAttribute?))");
11727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (parentType == XML_SCHEMA_TYPE_SIMPLE_CONTENT) {
11728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     xmlSchemaPContentErr(ctxt,
11729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
11732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"length | minLength | maxLength | enumeration | whiteSpace | "
11734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?))");
11735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Simple type */
11737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, (simpleType?, (minExclusive | minInclusive | "
11741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"maxExclusive | maxInclusive | totalDigits | fractionDigits | "
11742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"length | minLength | maxLength | enumeration | whiteSpace | "
11743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"pattern)*))");
11744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
11747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseExtension:
11751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parses an <extension>, which is found inside a
11756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * <simpleContent> or <complexContent>.
11757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change.
11758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: Returns the type definition or NULL in case of error
11760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
11762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseExtension(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
11763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr node, xmlSchemaTypeType parentType)
11764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
11770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
11771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_EXTENSION;
11774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
11782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "base"))) {
11783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute "base" - mandatory.
11797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlSchemaPValAttrQName(ctxt, schema, NULL, node,
11799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"base", &(type->baseNs), &(type->base)) == 0) &&
11800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->base == NULL)) {
11801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPMissingAttrErr(ctxt,
11802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ATTR_MISSING,
11803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "base", NULL);
11804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the type ancestor.
11812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent><extension>... and:
11820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
11821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Model groups <all>, <choice>, <sequence> and <group>.
11822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "all")) {
11824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child, XML_SCHEMA_TYPE_ALL, 1);
11827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "choice")) {
11829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    child, XML_SCHEMA_TYPE_CHOICE, 1);
11832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "sequence")) {
11834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema,
11836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		child, XML_SCHEMA_TYPE_SEQUENCE, 1);
11837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (IS_SCHEMA(child, "group")) {
11839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = (xmlSchemaTypePtr)
11840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
11841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
11842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
11843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
11844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
11845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute uses/declarations.
11851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
11853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
11854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_EXTENSION, NULL) == -1)
11855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
11856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Attribute wildcard.
11858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
11860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->ctxtType->attributeWildcard =
11861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseAnyAttribute(ctxt, schema, child);
11862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
11863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parentType == XML_SCHEMA_TYPE_COMPLEX_CONTENT) {
11867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Complex content extension. */
11868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, ((group | all | choice | sequence)?, "
11872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"((attribute | attributeGroup)*, anyAttribute?)))");
11873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
11874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Simple content extension. */
11875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPContentErr(ctxt,
11876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, node, child, NULL,
11878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"(annotation?, ((attribute | attributeGroup)*, "
11879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"anyAttribute?))");
11880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
11883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseSimpleContent:
11887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema SimpleContent definition
11892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
11895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseSimpleContent(xmlSchemaParserCtxtPtr ctxt,
11898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSchemaPtr schema, xmlNodePtr node,
11899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    int *hasRestrictionOrExtension)
11900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
11906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(hasRestrictionOrExtension == NULL))
11907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
11908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *hasRestrictionOrExtension = 0;
11909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
11910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
11911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
11912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
11914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
11916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
11917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
11918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id"))) {
11919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
11920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
11922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
11923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
11924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
11925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
11926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
11927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
11930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
11933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
11934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
11935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
11936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
11937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the complex type ancestor.
11938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
11939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
11940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
11941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
11944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
11946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL, NULL,
1194760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "(annotation?, (restriction | extension))");
11948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
11950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
11952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL, NULL,
1195360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "(annotation?, (restriction | extension))");
11954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "restriction")) {
11956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
11957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
11959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "extension")) {
11961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseExtension(ctxt, schema, child,
11962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_SIMPLE_CONTENT);
11963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
11964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
11965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
11967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
11968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
11969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child, NULL,
11970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "(annotation?, (restriction | extension))");
11971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
11972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
11973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
11976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseComplexContent:
11977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
11978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
11979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
11980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema ComplexContent definition
11982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
11983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
11985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
11987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseComplexContent(xmlSchemaParserCtxtPtr ctxt,
11988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlSchemaPtr schema, xmlNodePtr node,
11989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int *hasRestrictionOrExtension)
11990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type;
11992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
11993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
11994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL) ||
11996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(hasRestrictionOrExtension == NULL))
11997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
11998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *hasRestrictionOrExtension = 0;
11999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Not a component, don't create it. */
12000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = ctxt->ctxtType;
12001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check for illegal attributes.
12003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
12005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
12006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
12007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((!xmlStrEqual(attr->name, BAD_CAST "id")) &&
12008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(!xmlStrEqual(attr->name, BAD_CAST "mixed")))
12009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
12010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
12011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
12014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPIllegalAttrErr(ctxt,
12015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
12018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
12021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Set the 'mixed' on the complex type ancestor.
12024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlGetBooleanProp(ctxt, node, "mixed", 0))  {
12026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->flags & XML_SCHEMAS_TYPE_MIXED) == 0)
12027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_MIXED;
12028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
12030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
12031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add the annotation to the complex type ancestor.
12033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAddAnnotation((xmlSchemaAnnotItemPtr) type,
12035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaParseAnnotation(ctxt, child, 1));
12036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
12039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
12041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
12042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
12045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_MISSING,
12047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, NULL,
12048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "restriction")) {
12051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseRestriction(ctxt, schema, child,
12052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
12054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "extension")) {
12056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseExtension(ctxt, schema, child,
12057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX_CONTENT);
12058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(*hasRestrictionOrExtension) = 1;
12059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
12062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
12064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
12065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (restriction | extension))");
12066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
12068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseComplexType:
12072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
12073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema being built
12074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a subtree containing XML Schema informations
12075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a XML schema Complex Type definition
12077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * *WARNING* this interface is highly subject to change
12078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the type definition or NULL in case of error
12080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
12082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseComplexType(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
12083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlNodePtr node, int topLevel)
12084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type, ctxtType;
12086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child = NULL;
12087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = NULL;
12088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
12089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *attrValue;
12090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
12091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char buf[40];
12092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int final = 0, block = 0, hasRestrictionOrExtension = 0;
12094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
12097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxtType = ctxt->ctxtType;
12100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel) {
12102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = xmlSchemaGetPropNode(node, "name");
12103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr == NULL) {
12104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPMissingAttrErr(ctxt,
12105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_MISSING, NULL, node, "name", NULL);
12106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlSchemaPValAttrNode(ctxt, NULL, attr,
12108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetBuiltInType(XML_SCHEMAS_NCNAME), &name) != 0) {
12109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
1211060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
12111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel == 0) {
12114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as local complex type definition.
12116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
12118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(buf, 39, "#CT%d", ctxt->counter++ + 1);
12119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlDictLookup(ctxt->dict, (const xmlChar *)buf, -1),
12122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->targetNamespace, node, 0);
12123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
12124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ctxt->targetNamespace, node, 0);
12127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
12129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = type->name;
12131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node = node;
12132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_COMPLEX;
12133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We need the target namespace.
12135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse as global complex type definition.
12139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaAddType(ctxt, schema,
12141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_COMPLEX,
12142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    name, ctxt->targetNamespace, node, 1);
12143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL)
12144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
12145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->node = node;
12146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->type = XML_SCHEMA_TYPE_COMPLEX;
12147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_GLOBAL;
12148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->targetNamespace = ctxt->targetNamespace;
12150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle attributes.
12152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = node->properties;
12154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (attr != NULL) {
12155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->ns == NULL) {
12156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->name, BAD_CAST "id")) {
12157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attribute "id".
12159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPValAttrID(ctxt, node, BAD_CAST "id");
12161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlStrEqual(attr->name, BAD_CAST "mixed")) {
12162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attribute "mixed".
12164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaPGetBoolNodeValue(ctxt,
12166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, (xmlNodePtr) attr))
12167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_MIXED;
12168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (topLevel) {
12169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
12170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Attributes of global complex type definitions.
12171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
12172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlStrEqual(attr->name, BAD_CAST "name")) {
12173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Pass. */
12174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "abstract")) {
12175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "abstract".
12177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPGetBoolNodeValue(ctxt,
12179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr))
12180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->flags |= XML_SCHEMAS_TYPE_ABSTRACT;
12181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "final")) {
12182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "final".
12184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(ctxt,
12186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
12187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPValAttrBlockFinal(attrValue,
12188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			&(type->flags),
12189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1,
12190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_FINAL_EXTENSION,
12191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_FINAL_RESTRICTION,
12192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1, -1, -1) != 0)
12193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
12194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(ctxt,
12195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
12196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr, NULL,
12197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(#all | List of (extension | restriction))",
12198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
1219960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } else
12200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			final = 1;
12201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (xmlStrEqual(attr->name, BAD_CAST "block")) {
12202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attribute "block".
12204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrValue = xmlSchemaGetNodeContent(ctxt,
12206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr);
12207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaPValAttrBlockFinal(attrValue, &(type->flags),
12208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1,
12209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_BLOCK_EXTENSION,
12210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAS_TYPE_BLOCK_RESTRICTION,
12211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			-1, -1, -1) != 0) {
12212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPSimpleTypeErr(ctxt,
12213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_INVALID_VALUE,
12214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, (xmlNodePtr) attr, NULL,
12215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(#all | List of (extension | restriction)) ",
12216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrValue, NULL, NULL, NULL);
1221760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } else
12218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			block = 1;
12219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
12220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalAttrErr(ctxt,
12221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPIllegalAttrErr(ctxt,
12225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->ns->href, xmlSchemaNs)) {
1222860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaPIllegalAttrErr(ctxt,
12229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_S4S_ATTR_NOT_ALLOWED, NULL, attr);
12230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = attr->next;
12232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! block) {
12234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply default "block" values.
12236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_RESTRICTION)
12238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
12239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_BLOCK_DEFAULT_EXTENSION)
12240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
12241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! final) {
12243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply default "block" values.
12245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_RESTRICTION)
12247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FINAL_RESTRICTION;
12248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (schema->flags & XML_SCHEMAS_FINAL_DEFAULT_EXTENSION)
12249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FINAL_EXTENSION;
12250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * And now for the children...
12253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
12255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "annotation")) {
12256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        type->annot = xmlSchemaParseAnnotation(ctxt, child, 1);
12257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = type;
12260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_SCHEMA(child, "simpleContent")) {
12261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType><simpleContent>...
12263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.4.3 : 2.2
12264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Specifying mixed='true' when the <simpleContent>
12265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* alternative is chosen has no effect
12266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->flags & XML_SCHEMAS_TYPE_MIXED)
12268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags ^= XML_SCHEMAS_TYPE_MIXED;
12269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseSimpleContent(ctxt, schema, child,
12270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &hasRestrictionOrExtension);
12271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_SCHEMA(child, "complexContent")) {
12273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType><complexContent>...
12275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->contentType = XML_SCHEMA_CONTENT_EMPTY;
12277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaParseComplexContent(ctxt, schema, child,
12278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &hasRestrictionOrExtension);
12279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
12280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* E.g <complexType><sequence>... or <complexType><attribute>... etc.
12283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
12284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC
12285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "...the third alternative (neither <simpleContent> nor
12286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexContent>) is chosen. This case is understood as shorthand
1228760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* for complex content restricting the �ur-type definition�, and the
12288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* details of the mappings should be modified as necessary.
12289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->baseType = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
12291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_DERIVATION_METHOD_RESTRICTION;
12292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse model groups.
12294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_SCHEMA(child, "all")) {
12296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL, 1);
12299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "choice")) {
12301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_CHOICE, 1);
12304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "sequence")) {
12306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroup(ctxt, schema, child,
12308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_SEQUENCE, 1);
12309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_SCHEMA(child, "group")) {
12311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            type->subtypes = (xmlSchemaTypePtr)
12312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaParseModelGroupDefRef(ctxt, schema, child);
12313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that the reference will be resolved in
12315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaResolveTypeReferences();
12316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
12318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
12319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse attribute decls/refs.
12321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlSchemaParseLocalAttributes(ctxt, schema, &child,
12323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaItemListPtr *) &(type->attrUses),
12324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_RESTRICTION, NULL) == -1)
12325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
12326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Parse attribute wildcard.
12328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (IS_SCHEMA(child, "anyAttribute")) {
12330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attributeWildcard = xmlSchemaParseAnyAttribute(ctxt, schema, child);
12331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    child = child->next;
12332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
12335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPContentErr(ctxt,
12336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_S4S_ELEM_NOT_ALLOWED,
12337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, child,
12338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, "(annotation?, (simpleContent | complexContent | "
12339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "((group | all | choice | sequence)?, ((attribute | "
12340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "attributeGroup)*, anyAttribute?))))");
12341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * REDEFINE: SPEC src-redefine (5)
12344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (topLevel && ctxt->isRedefine && (! hasRestrictionOrExtension)) {
12346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_SRC_REDEFINE,
12347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, node, "This is a redefinition, thus the "
12348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "<complexType> must have a <restriction> or <extension> "
12349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "grand-child", NULL);
12350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->ctxtType = ctxtType;
12352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (type);
12353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
12356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
12357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Validating using Schemas			*
12358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
12359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
12362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
12363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Reading/Writing Schemas				*
12364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
12365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 /* Will be enabled if it is clear what options are needed. */
12368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParserCtxtSetOptions:
12370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:	a schema parser context
12371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of xmlSchemaParserOption
12372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the options to be used during the parse.
12374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of an
12376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * API error.
12377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtSetOptions(xmlSchemaParserCtxtPtr ctxt,
12380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int options)
12381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
12387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * WARNING: Change the start value if adding to the
12389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaParseOption.
12390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < (int) sizeof(int) * 8; i++) {
12392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (options & 1<<i) {
12393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
12394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
12395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->options = options;
12397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
12398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidCtxtGetOptions:
12402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema parser context
12403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the option combination of the parser context.
12405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
12407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtGetOptions(xmlSchemaParserCtxtPtr ctxt)
12408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
12412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
12413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->options);
12414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
12416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewParserCtxt:
12419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
12420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that file/resource expected
12422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
12423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewParserCtxt(const char *URL)
12428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL == NULL)
12432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
12438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1);
12439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewMemParserCtxt:
12444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  a pointer to a char array containing the schemas
12445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the size of the array
12446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that memory buffer expected
12448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schemas file.
12449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewMemParserCtxt(const char *buffer, int size)
12454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (size <= 0))
12458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
12459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = buffer;
12463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->size = size;
1246460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret->dict = xmlDictCreate();
12465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewDocParserCtxt:
12470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a preparsed document tree
12471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas parse context for that document.
12473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NB. The document may be modified during the parsing process.
12474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
12476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParserCtxtPtr
12478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewDocParserCtxt(xmlDocPtr doc)
12479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ret;
12481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
12483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      return (NULL);
12484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaParserCtxtCreate();
12485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
12486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
12487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
12488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
12489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* The application has responsibility for the document */
12490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->preserve = 1;
12491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
12493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeParserCtxt:
12497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
12498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context
12500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
12502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeParserCtxt(xmlSchemaParserCtxtPtr ctxt)
12503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
12505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
12506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->doc != NULL && !ctxt->preserve)
1250760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        xmlFreeDoc(ctxt->doc);
12508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL) {
12509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValidCtxt(ctxt->vctxt);
12510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ownsConstructor && (ctxt->constructor != NULL)) {
12512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ctxt->constructor);
12513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = NULL;
12514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 0;
12515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->attrProhibs != NULL)
12517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(ctxt->attrProhibs);
12518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(ctxt->dict);
12519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
12520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
12523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
12524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *			Building the content models			*
12525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
12526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
12527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12528df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
12529df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSchemaBuildContentModelForSubstGroup:
12530df143a5041f03a22808b59c76698770b74692815Selim Gurun *
12531df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if nillable, 0 otherwise
12532df143a5041f03a22808b59c76698770b74692815Selim Gurun */
12533df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModelForSubstGroup(xmlSchemaParserCtxtPtr pctxt,
12535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle, int counter, xmlAutomataStatePtr end)
12536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr start, tmp;
12538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl, member;
12539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSubstGroupPtr substGroup;
12540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
12541df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0;
12542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl = (xmlSchemaElementPtr) particle->children;
12544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
12545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Wrap the substitution group with a CHOICE.
12546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
12547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = pctxt->state;
12548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (end == NULL)
12549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end = xmlAutomataNewState(pctxt->am);
12550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    substGroup = xmlSchemaSubstGroupGet(pctxt, elemDecl);
12551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (substGroup == NULL) {
12552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(pctxt, WXS_ITEM_NODE(particle),
12553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
12554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Internal error: xmlSchemaBuildContentModelForSubstGroup, "
12555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "declaration is marked having a subst. group but none "
12556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "available.\n", elemDecl->name, NULL);
12557df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(0);
12558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (counter >= 0) {
12560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that we put the declaration in, even if it's abstract.
12562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* However, an error will be raised during *validation* if an element
12563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* information item shall be validated against an abstract element
12564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* declaration.
12565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlAutomataNewCountedTrans(pctxt->am, start, NULL, counter);
12567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlAutomataNewTransition2(pctxt->am, tmp, end,
12568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	            elemDecl->name, elemDecl->targetNamespace, elemDecl);
12569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add subst. group members.
12571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAutomataNewTransition2(pctxt->am, tmp, end,
12575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		               member->name, member->targetNamespace, member);
12576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (particle->maxOccurs == 1) {
12578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that we put the declaration in, even if it's abstract,
12580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am,
12582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewTransition2(pctxt->am,
12583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start, NULL,
12584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->name, elemDecl->targetNamespace, elemDecl), end);
12585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Add subst. group members.
12587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
12591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: This fixes bug #341150. xmlAutomataNewOnceTrans2()
12592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  was incorrectly used instead of xmlAutomataNewTransition2()
12593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  (seems like a copy&paste bug from the XML_SCHEMA_TYPE_ALL
12594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  section in xmlSchemaBuildAContentModel() ).
1259560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * TODO: Check if xmlAutomataNewOnceTrans2() was instead
12596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  intended for the above "counter" section originally. I.e.,
12597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  check xs:all with subst-groups.
12598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
12599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * tmp = xmlAutomataNewOnceTrans2(pctxt->am, start, NULL,
12600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	               member->name, member->targetNamespace,
12601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *		       1, 1, member);
12602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
12603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = xmlAutomataNewTransition2(pctxt->am, start, NULL,
1260460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		member->name, member->targetNamespace, member);
12605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(pctxt->am, tmp, end);
12606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataStatePtr hop;
12609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    UNBOUNDED : particle->maxOccurs - 1;
12611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int minOccurs = particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	counter =
12614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewCounter(pctxt->am, minOccurs,
12615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    maxOccurs);
12616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	hop = xmlAutomataNewState(pctxt->am);
12617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am,
12619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewTransition2(pctxt->am,
12620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start, NULL,
12621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->name, elemDecl->targetNamespace, elemDecl),
12622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hop);
12623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Add subst. group members.
12625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
12626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < substGroup->members->nbItems; i++) {
12627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = (xmlSchemaElementPtr) substGroup->members->items[i];
12628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(pctxt->am,
12629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewTransition2(pctxt->am,
12630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		start, NULL,
12631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member->name, member->targetNamespace, member),
12632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hop);
12633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
12635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
12636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12637df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (particle->minOccurs == 0) {
12638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataNewEpsilon(pctxt->am, start, end);
12639df143a5041f03a22808b59c76698770b74692815Selim Gurun        ret = 1;
12640df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
12641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->state = end;
12642df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
12643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12645df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
12646df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlSchemaBuildContentModelForElement:
12647df143a5041f03a22808b59c76698770b74692815Selim Gurun *
12648df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if nillable, 0 otherwise
12649df143a5041f03a22808b59c76698770b74692815Selim Gurun */
12650df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModelForElement(xmlSchemaParserCtxtPtr ctxt,
12652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaParticlePtr particle)
12653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12654df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0;
12655df143a5041f03a22808b59c76698770b74692815Selim Gurun
12656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((xmlSchemaElementPtr) particle->children)->flags &
12657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
12658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Substitution groups.
12660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12661df143a5041f03a22808b59c76698770b74692815Selim Gurun	ret = xmlSchemaBuildContentModelForSubstGroup(ctxt, particle, -1, NULL);
12662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
12663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr elemDecl;
12664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlAutomataStatePtr start;
12665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	elemDecl = (xmlSchemaElementPtr) particle->children;
12667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT)
12669df143a5041f03a22808b59c76698770b74692815Selim Gurun	    return(0);
12670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (particle->maxOccurs == 1) {
12671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = ctxt->state;
12672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
12673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    elemDecl->name, elemDecl->targetNamespace, elemDecl);
12674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((particle->maxOccurs >= UNBOUNDED) &&
12675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           (particle->minOccurs < 2)) {
12676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Special case. */
1267760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    start = ctxt->state;
12678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
1267960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, ctxt->state, ctxt->state,
1268160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
12683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int counter;
12684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    UNBOUNDED : particle->maxOccurs - 1;
12686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int minOccurs = particle->minOccurs < 1 ?
12687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    0 : particle->minOccurs - 1;
12688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
12690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    counter = xmlAutomataNewCounter(ctxt->am, minOccurs, maxOccurs);
12691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewTransition2(ctxt->am, start, NULL,
12692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->name, elemDecl->targetNamespace, elemDecl);
12693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewCountedTrans(ctxt->am, ctxt->state, start, counter);
12694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->state = xmlAutomataNewCounterTrans(ctxt->am, ctxt->state,
12695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, counter);
12696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12697df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (particle->minOccurs == 0) {
12698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataNewEpsilon(ctxt->am, start, ctxt->state);
12699df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
12700df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
12701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12702df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
12703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
12704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
12706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaBuildAContentModel:
12707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
12708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle:  the particle component
12709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the complex type's name whose content is being built
12710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create the automaton for the {content type} of a complex type.
12712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
12713df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 1 if the content is nillable, 0 otherwise
12714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
12715df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
12716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildAContentModel(xmlSchemaParserCtxtPtr pctxt,
12717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr particle)
12718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
12719df143a5041f03a22808b59c76698770b74692815Selim Gurun    int ret = 0, tmp2;
12720df143a5041f03a22808b59c76698770b74692815Selim Gurun
12721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle == NULL) {
1272260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	PERROR_INT("xmlSchemaBuildAContentModel", "particle is NULL");
12723df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(1);
12724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children == NULL) {
12726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
12727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Just return in this case. A missing "term" of the particle
12728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* might arise due to an invalid "term" component.
12729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
12730df143a5041f03a22808b59c76698770b74692815Selim Gurun	return(1);
12731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
12732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (particle->children->type) {
12734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ANY: {
12735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlAutomataStatePtr start, end;
12736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardPtr wild;
12737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr ns;
12738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    wild = (xmlSchemaWildcardPtr) particle->children;
12740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    start = pctxt->state;
12742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = xmlAutomataNewState(pctxt->am);
12743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (particle->maxOccurs == 1) {
12745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (wild->any == 1) {
12746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * We need to add both transitions:
12748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
12749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 1. the {"*", "*"} for elements in a namespace.
12750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
12754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
12756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 2. the {"*"} for elements in no namespace.
12757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
12758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", NULL, wild);
12761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->nsSet != NULL) {
12764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = wild->nsSet;
12765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
12766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state = start;
12767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state = xmlAutomataNewTransition2(pctxt->am,
12768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    pctxt->state, NULL, BAD_CAST "*", ns->value, wild);
12769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = ns->next;
12771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ns != NULL);
12772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->negNsSet != NULL) {
12774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, end, BAD_CAST "*", wild->negNsSet->value,
12776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wild);
12777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
12779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int counter;
12780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataStatePtr hop;
12781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int maxOccurs =
12782df143a5041f03a22808b59c76698770b74692815Selim Gurun		    particle->maxOccurs == UNBOUNDED ? UNBOUNDED :
12783df143a5041f03a22808b59c76698770b74692815Selim Gurun                                           particle->maxOccurs - 1;
12784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int minOccurs =
12785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		counter = xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		hop = xmlAutomataNewState(pctxt->am);
12789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (wild->any == 1) {
12790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", BAD_CAST "*", wild);
12793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state =
12795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewTransition2(pctxt->am,
12796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, NULL, BAD_CAST "*", NULL, wild);
12797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->nsSet != NULL) {
12799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = wild->nsSet;
12800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    do {
12801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pctxt->state =
12802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlAutomataNewTransition2(pctxt->am,
12803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				start, NULL, BAD_CAST "*", ns->value, wild);
12804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = ns->next;
12806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (ns != NULL);
12807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (wild->negNsSet != NULL) {
12809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt->state = xmlAutomataNewNegTrans(pctxt->am,
12810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			start, hop, BAD_CAST "*", wild->negNsSet->value,
12811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wild);
12812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
12813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewCountedTrans(pctxt->am, hop, start, counter);
12814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
12815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (particle->minOccurs == 0) {
12817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAutomataNewEpsilon(pctxt->am, start, end);
12818df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
12819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
12820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    pctxt->state = end;
12821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
12822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
12823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_ELEMENT:
12824df143a5041f03a22808b59c76698770b74692815Selim Gurun	    ret = xmlSchemaBuildContentModelForElement(pctxt, particle);
12825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
12826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_TYPE_SEQUENCE:{
12827df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaTreeItemPtr sub;
12828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12829df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
12830df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
12831df143a5041f03a22808b59c76698770b74692815Selim Gurun             * If max and min occurances are default (1) then
12832df143a5041f03a22808b59c76698770b74692815Selim Gurun             * simply iterate over the particles of the <sequence>.
12833df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
12834df143a5041f03a22808b59c76698770b74692815Selim Gurun            if ((particle->minOccurs == 1) && (particle->maxOccurs == 1)) {
12835df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
12836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12837df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (sub != NULL) {
12838df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
12839df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12840df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 != 1) ret = 0;
12841df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
12842df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
12843df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
12844df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataStatePtr oldstate = pctxt->state;
12845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12846df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (particle->maxOccurs >= UNBOUNDED) {
12847df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (particle->minOccurs > 1) {
12848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlAutomataStatePtr tmp;
12849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        int counter;
12850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12852df143a5041f03a22808b59c76698770b74692815Selim Gurun                            oldstate, NULL);
12853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        oldstate = pctxt->state;
12854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        counter = xmlAutomataNewCounter(pctxt->am,
12856df143a5041f03a22808b59c76698770b74692815Selim Gurun                            particle->minOccurs - 1, UNBOUNDED);
12857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = particle->children->children;
12859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (sub != NULL) {
12860df143a5041f03a22808b59c76698770b74692815Selim Gurun                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
12861df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            (xmlSchemaParticlePtr) sub);
12862df143a5041f03a22808b59c76698770b74692815Selim Gurun                            if (tmp2 != 1) ret = 0;
12863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            sub = sub->next;
12864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = pctxt->state;
12866df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCountedTrans(pctxt->am, tmp,
12867df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   oldstate, counter);
12868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pctxt->state =
12869df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlAutomataNewCounterTrans(pctxt->am, tmp,
12870df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                       NULL, counter);
12871df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (ret == 1)
12872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlAutomataNewEpsilon(pctxt->am,
12873df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                oldstate, pctxt->state);
12874df143a5041f03a22808b59c76698770b74692815Selim Gurun
12875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
12876df143a5041f03a22808b59c76698770b74692815Selim Gurun                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12877df143a5041f03a22808b59c76698770b74692815Selim Gurun                            oldstate, NULL);
12878df143a5041f03a22808b59c76698770b74692815Selim Gurun                        oldstate = pctxt->state;
12879df143a5041f03a22808b59c76698770b74692815Selim Gurun
12880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = particle->children->children;
12881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (sub != NULL) {
12882df143a5041f03a22808b59c76698770b74692815Selim Gurun                            tmp2 = xmlSchemaBuildAContentModel(pctxt,
12883df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12884df143a5041f03a22808b59c76698770b74692815Selim Gurun                            if (tmp2 != 1) ret = 0;
12885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            sub = sub->next;
12886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12887df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am, pctxt->state,
12888df143a5041f03a22808b59c76698770b74692815Selim Gurun                                              oldstate);
12889df143a5041f03a22808b59c76698770b74692815Selim Gurun                        /*
12890df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * epsilon needed to block previous trans from
12891df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * being allowed to enter back from another
12892df143a5041f03a22808b59c76698770b74692815Selim Gurun                         * construct
12893df143a5041f03a22808b59c76698770b74692815Selim Gurun                         */
12894df143a5041f03a22808b59c76698770b74692815Selim Gurun                        pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12895df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            pctxt->state, NULL);
12896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (particle->minOccurs == 0) {
12897df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlAutomataNewEpsilon(pctxt->am,
12898df143a5041f03a22808b59c76698770b74692815Selim Gurun                                oldstate, pctxt->state);
12899df143a5041f03a22808b59c76698770b74692815Selim Gurun                            ret = 1;
12900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
12901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12902df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else if ((particle->maxOccurs > 1)
12903df143a5041f03a22808b59c76698770b74692815Selim Gurun                           || (particle->minOccurs > 1)) {
12904df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataStatePtr tmp;
12905df143a5041f03a22808b59c76698770b74692815Selim Gurun                    int counter;
12906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12907df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state = xmlAutomataNewEpsilon(pctxt->am,
12908df143a5041f03a22808b59c76698770b74692815Selim Gurun                        oldstate, NULL);
12909df143a5041f03a22808b59c76698770b74692815Selim Gurun                    oldstate = pctxt->state;
12910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12911df143a5041f03a22808b59c76698770b74692815Selim Gurun                    counter = xmlAutomataNewCounter(pctxt->am,
12912df143a5041f03a22808b59c76698770b74692815Selim Gurun                        particle->minOccurs - 1,
12913df143a5041f03a22808b59c76698770b74692815Selim Gurun                        particle->maxOccurs - 1);
12914df143a5041f03a22808b59c76698770b74692815Selim Gurun
12915df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = particle->children->children;
12916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (sub != NULL) {
12917df143a5041f03a22808b59c76698770b74692815Selim Gurun                        tmp2 = xmlSchemaBuildAContentModel(pctxt,
12918df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12919df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (tmp2 != 1) ret = 0;
12920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = sub->next;
12921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12922df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp = pctxt->state;
12923df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewCountedTrans(pctxt->am,
12924df143a5041f03a22808b59c76698770b74692815Selim Gurun                        tmp, oldstate, counter);
12925df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state =
12926df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCounterTrans(pctxt->am, tmp, NULL,
12927df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   counter);
12928df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if ((particle->minOccurs == 0) || (ret == 1)) {
12929df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am,
12930df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            oldstate, pctxt->state);
12931df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ret = 1;
12932df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
12933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
12934df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = particle->children->children;
12935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (sub != NULL) {
12936df143a5041f03a22808b59c76698770b74692815Selim Gurun                        tmp2 = xmlSchemaBuildAContentModel(pctxt,
12937df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12938df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (tmp2 != 1) ret = 0;
12939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        sub = sub->next;
12940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
12941df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (particle->minOccurs == 0) {
12942df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewEpsilon(pctxt->am, oldstate,
12943df143a5041f03a22808b59c76698770b74692815Selim Gurun                                              pctxt->state);
12944df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ret = 1;
12945df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
12946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
12947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
12948df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
12949df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
12950df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_SCHEMA_TYPE_CHOICE:{
12951df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaTreeItemPtr sub;
12952df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataStatePtr start, end;
12953df143a5041f03a22808b59c76698770b74692815Selim Gurun
12954df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 0;
12955df143a5041f03a22808b59c76698770b74692815Selim Gurun            start = pctxt->state;
12956df143a5041f03a22808b59c76698770b74692815Selim Gurun            end = xmlAutomataNewState(pctxt->am);
12957df143a5041f03a22808b59c76698770b74692815Selim Gurun
12958df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
12959df143a5041f03a22808b59c76698770b74692815Selim Gurun             * iterate over the subtypes and remerge the end with an
12960df143a5041f03a22808b59c76698770b74692815Selim Gurun             * epsilon transition
12961df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
12962df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->maxOccurs == 1) {
12963df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
12964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (sub != NULL) {
12965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    pctxt->state = start;
12966df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
12967df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12968df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 == 1) ret = 1;
12969df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, end);
12970df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
12971df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
12972df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
12973df143a5041f03a22808b59c76698770b74692815Selim Gurun                int counter;
12974df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataStatePtr hop, base;
12975df143a5041f03a22808b59c76698770b74692815Selim Gurun                int maxOccurs = particle->maxOccurs == UNBOUNDED ?
12976df143a5041f03a22808b59c76698770b74692815Selim Gurun                    UNBOUNDED : particle->maxOccurs - 1;
12977df143a5041f03a22808b59c76698770b74692815Selim Gurun                int minOccurs =
12978df143a5041f03a22808b59c76698770b74692815Selim Gurun                    particle->minOccurs < 1 ? 0 : particle->minOccurs - 1;
12979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
12980df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
12981df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * use a counter to keep track of the number of transtions
12982df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * which went through the choice.
12983df143a5041f03a22808b59c76698770b74692815Selim Gurun                 */
12984df143a5041f03a22808b59c76698770b74692815Selim Gurun                counter =
12985df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewCounter(pctxt->am, minOccurs, maxOccurs);
12986df143a5041f03a22808b59c76698770b74692815Selim Gurun                hop = xmlAutomataNewState(pctxt->am);
12987df143a5041f03a22808b59c76698770b74692815Selim Gurun                base = xmlAutomataNewState(pctxt->am);
12988df143a5041f03a22808b59c76698770b74692815Selim Gurun
12989df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = particle->children->children;
12990df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (sub != NULL) {
12991df143a5041f03a22808b59c76698770b74692815Selim Gurun                    pctxt->state = base;
12992df143a5041f03a22808b59c76698770b74692815Selim Gurun                    tmp2 = xmlSchemaBuildAContentModel(pctxt,
12993df143a5041f03a22808b59c76698770b74692815Selim Gurun                                        (xmlSchemaParticlePtr) sub);
12994df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (tmp2 == 1) ret = 1;
12995df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, pctxt->state, hop);
12996df143a5041f03a22808b59c76698770b74692815Selim Gurun                    sub = sub->next;
12997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
12998df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, base);
12999df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewCountedTrans(pctxt->am, hop, base, counter);
13000df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewCounterTrans(pctxt->am, hop, end, counter);
13001df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (ret == 1)
13002df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlAutomataNewEpsilon(pctxt->am, base, end);
13003df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13004df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->minOccurs == 0) {
13005df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, end);
13006df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
13007df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13008df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state = end;
13009df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
13010df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
13011df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_SCHEMA_TYPE_ALL:{
13012df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataStatePtr start, tmp;
13013df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaParticlePtr sub;
13014df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSchemaElementPtr elemDecl;
13015df143a5041f03a22808b59c76698770b74692815Selim Gurun
13016df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
13017df143a5041f03a22808b59c76698770b74692815Selim Gurun
13018df143a5041f03a22808b59c76698770b74692815Selim Gurun            sub = (xmlSchemaParticlePtr) particle->children->children;
13019df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (sub == NULL)
13020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
13021df143a5041f03a22808b59c76698770b74692815Selim Gurun
13022df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 0;
13023df143a5041f03a22808b59c76698770b74692815Selim Gurun
13024df143a5041f03a22808b59c76698770b74692815Selim Gurun            start = pctxt->state;
13025df143a5041f03a22808b59c76698770b74692815Selim Gurun            tmp = xmlAutomataNewState(pctxt->am);
13026df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlAutomataNewEpsilon(pctxt->am, pctxt->state, tmp);
13027df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state = tmp;
13028df143a5041f03a22808b59c76698770b74692815Selim Gurun            while (sub != NULL) {
13029df143a5041f03a22808b59c76698770b74692815Selim Gurun                pctxt->state = tmp;
13030df143a5041f03a22808b59c76698770b74692815Selim Gurun
13031df143a5041f03a22808b59c76698770b74692815Selim Gurun                elemDecl = (xmlSchemaElementPtr) sub->children;
13032df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (elemDecl == NULL) {
13033df143a5041f03a22808b59c76698770b74692815Selim Gurun                    PERROR_INT("xmlSchemaBuildAContentModel",
13034df143a5041f03a22808b59c76698770b74692815Selim Gurun                        "<element> particle has no term");
13035df143a5041f03a22808b59c76698770b74692815Selim Gurun                    return(ret);
13036df143a5041f03a22808b59c76698770b74692815Selim Gurun                };
13037df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
13038df143a5041f03a22808b59c76698770b74692815Selim Gurun                * NOTE: The {max occurs} of all the particles in the
13039df143a5041f03a22808b59c76698770b74692815Selim Gurun                * {particles} of the group must be 0 or 1; this is
13040df143a5041f03a22808b59c76698770b74692815Selim Gurun                * already ensured during the parse of the content of
13041df143a5041f03a22808b59c76698770b74692815Selim Gurun                * <all>.
13042df143a5041f03a22808b59c76698770b74692815Selim Gurun                */
13043df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (elemDecl->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) {
13044df143a5041f03a22808b59c76698770b74692815Selim Gurun                    int counter;
13045df143a5041f03a22808b59c76698770b74692815Selim Gurun
13046df143a5041f03a22808b59c76698770b74692815Selim Gurun                    /*
13047df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * This is an abstract group, we need to share
13048df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * the same counter for all the element transitions
13049df143a5041f03a22808b59c76698770b74692815Selim Gurun                     * derived from the group
13050df143a5041f03a22808b59c76698770b74692815Selim Gurun                     */
13051df143a5041f03a22808b59c76698770b74692815Selim Gurun                    counter = xmlAutomataNewCounter(pctxt->am,
13052df143a5041f03a22808b59c76698770b74692815Selim Gurun                                       sub->minOccurs, sub->maxOccurs);
13053df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlSchemaBuildContentModelForSubstGroup(pctxt,
13054df143a5041f03a22808b59c76698770b74692815Selim Gurun                                       sub, counter, pctxt->state);
13055df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else {
13056df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if ((sub->minOccurs == 1) &&
13057df143a5041f03a22808b59c76698770b74692815Selim Gurun                        (sub->maxOccurs == 1)) {
13058df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewOnceTrans2(pctxt->am, pctxt->state,
13059df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                pctxt->state,
13060df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                elemDecl->name,
13061df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                elemDecl->targetNamespace,
13062df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                1, 1, elemDecl);
13063df143a5041f03a22808b59c76698770b74692815Selim Gurun                    } else if ((sub->minOccurs == 0) &&
13064df143a5041f03a22808b59c76698770b74692815Selim Gurun                        (sub->maxOccurs == 1)) {
13065df143a5041f03a22808b59c76698770b74692815Selim Gurun
13066df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlAutomataNewCountTrans2(pctxt->am, pctxt->state,
13067df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 pctxt->state,
13068df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl->name,
13069df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl->targetNamespace,
13070df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 0,
13071df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 1,
13072df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 elemDecl);
13073df143a5041f03a22808b59c76698770b74692815Selim Gurun                    }
13074df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
13075df143a5041f03a22808b59c76698770b74692815Selim Gurun                sub = (xmlSchemaParticlePtr) sub->next;
13076df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
13077df143a5041f03a22808b59c76698770b74692815Selim Gurun            pctxt->state =
13078df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewAllTrans(pctxt->am, pctxt->state, NULL, 0);
13079df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (particle->minOccurs == 0) {
13080df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataNewEpsilon(pctxt->am, start, pctxt->state);
13081df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = 1;
13082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
13083df143a5041f03a22808b59c76698770b74692815Selim Gurun            break;
13084df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
13085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_GROUP:
13086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * If we hit a model group definition, then this means that
13088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * it was empty, thus was not substituted for the containing
13089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * model group. Just do nothing in this case.
13090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: But the group should be substituted and not occur at
13091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * all in the content model at this point. Fix this.
13092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13093df143a5041f03a22808b59c76698770b74692815Selim Gurun            ret = 1;
13094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
13095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
13096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaInternalErr2(ACTXT_CAST pctxt,
13097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"xmlSchemaBuildAContentModel",
13098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"found unexpected term of type '%s' in content model",
13099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(particle->children), NULL);
13100df143a5041f03a22808b59c76698770b74692815Selim Gurun            return(ret);
13101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13102df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(ret);
13103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaBuildContentModel:
13107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
13109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the element name
13110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds the content model of the complex type.
13112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
13114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBuildContentModel(xmlSchemaTypePtr type,
13115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParserCtxtPtr ctxt)
13116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->type != XML_SCHEMA_TYPE_COMPLEX) ||
13118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->contModel != NULL) ||
13119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((type->contentType != XML_SCHEMA_CONTENT_ELEMENTS) &&
13120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->contentType != XML_SCHEMA_CONTENT_MIXED)))
13121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
13122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT
13124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
13125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Building content model for %s\n", name);
13126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = NULL;
13128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = xmlNewAutomata();
13129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->am == NULL) {
13130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
13131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Cannot create automata for complex type %s\n", type->name);
13132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
13133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = xmlAutomataGetInitState(ctxt->am);
13135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Build the automaton.
13137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBuildAContentModel(ctxt, WXS_TYPE_PARTICLE(type));
13139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataSetFinalState(ctxt->am, ctxt->state);
13140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contModel = xmlAutomataCompile(ctxt->am);
13141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contModel == NULL) {
13142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPCustomErr(ctxt,
13143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_INTERNAL,
13144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, type->node,
13145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Failed to compile the content model", NULL);
13146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlRegexpIsDeterminist(type->contModel) != 1) {
13147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaPCustomErr(ctxt,
13148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_NOT_DETERMINISTIC,
13149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* XML_SCHEMAS_ERR_NOTDETERMINIST, */
13150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, type->node,
13151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The content model is not determinist", NULL);
13152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
13153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT_REGEXP
13154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
13155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Content model of %s:\n", type->name);
13156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegexpPrint(stderr, type->contModel);
13157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = NULL;
13160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFreeAutomata(ctxt->am);
13161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->am = NULL;
13162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveElementReferences:
13166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  the schema element context
13167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the references of an element declaration
13170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or particle, which has an element declaration as it's
13171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * term.
13172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
13174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveElementReferences(xmlSchemaElementPtr elemDecl,
13175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParserCtxtPtr ctxt)
13176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elemDecl == NULL) ||
13178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemDecl != NULL) &&
13179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_RESOLVED)))
13180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
13181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_RESOLVED;
13182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->subtypes == NULL) && (elemDecl->namedType != NULL)) {
13184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr type;
13185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1318660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* (type definition) ... otherwise the type definition �resolved�
1318760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to by the �actual value� of the type [attribute] ...
13188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaGetType(ctxt->schema, elemDecl->namedType,
13190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->namedTypeNs);
13191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type == NULL) {
13192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
13193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
13194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, elemDecl->node,
13195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type", elemDecl->namedType, elemDecl->namedTypeNs,
13196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_BASIC, "type definition");
13197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
13198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->subtypes = type;
13199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->substGroup != NULL) {
13201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr substHead;
13202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* FIXME TODO: Do we need a new field in _xmlSchemaElement for
13205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* substitutionGroup?
13206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	substHead = xmlSchemaGetElem(ctxt->schema, elemDecl->substGroup,
13208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemDecl->substGroupNs);
13209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (substHead == NULL) {
13210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
13211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
13212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, NULL,
13213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitutionGroup", elemDecl->substGroup,
13214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->substGroupNs, XML_SCHEMA_TYPE_ELEMENT, NULL);
13215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaResolveElementReferences(substHead, ctxt);
13217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Set the "substitution group affiliation".
13219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that now we use the "refDecl" field for this.
13220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_SUBST_HEAD(elemDecl) = substHead;
13222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The type definitions is set to:
13224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC "...the {type definition} of the element
1322560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * declaration �resolved� to by the �actual value�
13226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the substitutionGroup [attribute], if present"
13227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elemDecl->subtypes == NULL)
13229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->subtypes = substHead->subtypes;
13230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC "The definition of anyType serves as the default type definition
13234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for element declarations whose XML representation does not specify one."
13235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->subtypes == NULL) &&
13237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->namedType == NULL) &&
13238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->substGroup == NULL))
13239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	elemDecl->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
13240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveUnionMemberTypes:
13244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the schema simple type definition
13246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks and builds the "member type definitions" property of the union
13248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * simple type. This handles part (1), part (2) is done in
13249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFinishMemberTypeDefinitionsProperty()
13250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of an internal error, 0 otherwise.
13252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveUnionMemberTypes(xmlSchemaParserCtxtPtr ctxt,
13255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
13256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr link, lastLink, newLink;
13259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr memberType;
13260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "If the <union> alternative is chosen, then [Definition:]
1326360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * define the explicit members as the type definitions �resolved�
1326460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * to by the items in the �actual value� of the memberTypes [attribute],
13265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if any, followed by the type definitions corresponding to the
13266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * <simpleType>s among the [children] of <union>, if any."
13267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve references.
13270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    link = type->memberTypes;
13272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lastLink = NULL;
13273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
13274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *name, *nsName;
13275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	name = ((xmlSchemaQNameRefPtr) link->type)->name;
13277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = ((xmlSchemaQNameRefPtr) link->type)->targetNamespace;
13278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = xmlSchemaGetType(ctxt->schema, name, nsName);
13280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((memberType == NULL) || (! WXS_IS_SIMPLE(memberType))) {
13281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
13282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node, "memberTypes",
13283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name, nsName, XML_SCHEMA_TYPE_SIMPLE, NULL);
13284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Remove the member type link.
13286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lastLink == NULL)
13288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->memberTypes = link->next;
13289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
13290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		lastLink->next = link->next;
13291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    newLink = link;
13292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
13293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(newLink);
13294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->type = memberType;
13296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastLink = link;
13297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
13298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add local simple types,
13302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memberType = type->subtypes;
13304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (memberType != NULL) {
13305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = (xmlSchemaTypeLinkPtr) xmlMalloc(sizeof(xmlSchemaTypeLink));
13306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (link == NULL) {
13307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErrMemory(ctxt, "allocating a type link", NULL);
13308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
13309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link->type = memberType;
13311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link->next = NULL;
13312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (lastLink == NULL)
13313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->memberTypes = link;
13314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
13315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    lastLink->next = link;
13316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	lastLink = link;
13317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = memberType->next;
13318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsDerivedFromBuiltInType:
13324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
13326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the value type
13327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type has the given value type, or
13330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is derived from such a type.
13331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
13334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
13340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType == valType)
13341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
13342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->builtInType == XML_SCHEMAS_ANYTYPE))
13344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
13345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
13351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsDerivedFromBuiltInType:
13353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
13355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @valType: the value type
13356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type has the given value type, or
13359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is derived from such a type.
13360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsUserDerivedFromBuiltInType(xmlSchemaTypePtr type, int valType)
13363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
13369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->builtInType == valType)
13370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(1);
13371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
13373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaIsDerivedFromBuiltInType(type->subtypes, valType));
13374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaQueryBuiltInType(xmlSchemaTypePtr type)
13380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
13382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
13383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type))
13384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
13385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC)
13386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(type);
13387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaQueryBuiltInType(type->subtypes));
13388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1338960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
13390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetPrimitiveType:
13393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simpleType definition
13394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the primitive type of the given type or
13396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error.
13397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetPrimitiveType(xmlSchemaTypePtr type)
13400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (type != NULL) {
13403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that anySimpleType is actually not a primitive type
13405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* but we need that here.
13406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) ||
13408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (type->flags & XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE))
13409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type);
13410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
13411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
13414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
13417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetBuiltInTypeAncestor:
13419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simpleType definition
13420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the primitive type of the given type or
13422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error.
13423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypePtr
13425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetBuiltInTypeAncestor(xmlSchemaTypePtr type)
13426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type) || WXS_IS_UNION(type))
13428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (type != NULL) {
13430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->type == XML_SCHEMA_TYPE_BASIC)
13431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type);
13432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = type->baseType;
13433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
13436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
13438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCloneWildcardNsConstraints:
13441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dest:  the destination wildcard
13443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @source: the source wildcard
13444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Clones the namespace constraints of source
13446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and assignes them to dest.
13447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 on internal error, 0 otherwise.
13448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCloneWildcardNsConstraints(xmlSchemaParserCtxtPtr ctxt,
13451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaWildcardPtr dest,
13452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaWildcardPtr source)
13453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, tmp, last;
13455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((source == NULL) || (dest == NULL))
13457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
13458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    dest->any = source->any;
13459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = source->nsSet;
13460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
13461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
13462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (tmp == NULL)
13464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmp->value = cur->value;
13466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (last == NULL)
13467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dest->nsSet = tmp;
13468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
13469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last->next = tmp;
13470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	last = tmp;
13471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
13472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dest->negNsSet != NULL)
13474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeWildcardNsSet(dest->negNsSet);
13475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (source->negNsSet != NULL) {
13476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (dest->negNsSet == NULL)
13478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet->value = source->negNsSet->value;
13480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
13481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	dest->negNsSet = NULL;
13482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
13483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaUnionWildcards:
13487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild:  the first wildcard
13489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @curWild: the second wildcard
13490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unions the namespace constraints of the given wildcards.
13492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild will hold the resulting union.
13493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a positive error code on failure, -1 in case of an
13494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal error, 0 otherwise.
13495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaUnionWildcards(xmlSchemaParserCtxtPtr ctxt,
13498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr completeWild,
13499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr curWild)
13500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, curB, tmp;
13502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If O1 and O2 are the same value, then that value must be the
13505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * value.
13506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any == curWild->any) &&
13508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
13509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
13510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((completeWild->negNsSet == NULL) ||
13512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int found = 0;
13516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Check equality of sets.
13519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = completeWild->nsSet;
13521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
13522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 0;
13523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curWild->nsSet;
13524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (curB != NULL) {
13525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (cur->value == curB->value) {
13526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
13527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
13528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curB = curB->next;
13530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!found)
13532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->next;
13534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (found)
13536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
13537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 If either O1 or O2 is any, then any must be the value
13543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (completeWild->any != curWild->any) {
13545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->any == 0) {
13546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->any = 1;
13547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet != NULL) {
13552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(completeWild->negNsSet);
13553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = NULL;
13554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1355960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 3 If both O1 and O2 are sets of (namespace names or �absent�),
13560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the union of those sets must be the value.
13561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
13563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
13564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaWildcardNsPtr start;
13565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = curWild->nsSet;
13567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	start = completeWild->nsSet;
13568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
13570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = start;
13571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (curB != NULL) {
13572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == curB->value) {
13573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
13574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = curB->next;
13577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
13579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = xmlSchemaNewWildcardNsConstraint(ctxt);
13580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (tmp == NULL)
13581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp->value = cur->value;
13583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp->next = completeWild->nsSet;
13584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = tmp;
13585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 4 If the two are negations of different values (namespace names
1359360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * or �absent�), then a pair of not and �absent� must be the value.
13594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) &&
13596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet != NULL) &&
13597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value)) {
13598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	completeWild->negNsSet->value = NULL;
13599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 5.
13604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
13605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) &&
13606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != NULL) &&
13607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->nsSet != NULL)) ||
13608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) &&
13609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value != NULL) &&
13610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->nsSet != NULL))) {
13611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int nsFound, absentFound = 0;
13613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet != NULL) {
13615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = curWild->negNsSet;
13617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = curWild->nsSet;
13619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = completeWild->negNsSet;
13620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsFound = 0;
13622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL)
13624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		absentFound = 1;
13625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (cur->value == curB->value)
13626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsFound = 1;
13627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsFound && absentFound)
13628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsFound && absentFound) {
13633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.1 If the set S includes both the negated namespace
1363560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * name and �absent�, then any must be the value.
13636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->any = 1;
13638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet != NULL) {
13643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(completeWild->negNsSet);
13644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = NULL;
13645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (nsFound && (!absentFound)) {
13647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.2 If the set S includes the negated namespace name
1364960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * but not �absent�, then a pair of not and �absent� must
13650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be the value.
13651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL) {
13657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet == NULL)
13659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet->value = NULL;
13662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!nsFound) && absentFound) {
13663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1366460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 5.3 If the set S includes �absent� but not the negated
13665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * namespace name, then the union is not expressible.
13666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, completeWild->node,
13668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_UNION_NOT_EXPRESSIBLE,
13669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The union of the wilcard is not expressible.\n",
13670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
13671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAP_UNION_NOT_EXPRESSIBLE);
13672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((!nsFound) && (!absentFound)) {
13673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 5.4 If the set S does not include either the negated namespace
1367560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * name or �absent�, then whichever of O1 or O2 is a pair of not
13676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * and a namespace name must be the value.
13677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL) {
13679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->nsSet != NULL) {
13680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = NULL;
13682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet == NULL)
13685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
13686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->negNsSet->value = curWild->negNsSet->value;
13687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * 6.
13693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
13694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) &&
13695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value == NULL) &&
13696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->nsSet != NULL)) ||
13697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) &&
13698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value == NULL) &&
13699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->nsSet != NULL))) {
13700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet != NULL) {
13702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
13704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = curWild->nsSet;
13705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL) {
13708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1370960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 6.1 If the set S includes �absent�, then any must be the
13710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* value.
13711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->any = 1;
13713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->nsSet != NULL) {
13714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = NULL;
13716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (completeWild->negNsSet != NULL) {
13718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(completeWild->negNsSet);
13719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->negNsSet = NULL;
13720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
13722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->negNsSet == NULL) {
13726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1372760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 6.2 If the set S does not include �absent�, then a pair of not
1372860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * and �absent� must be the value.
13729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFreeWildcardNsSet(completeWild->nsSet);
13732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		completeWild->nsSet = NULL;
13733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet = xmlSchemaNewWildcardNsConstraint(ctxt);
13735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->negNsSet == NULL)
13736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
13737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    completeWild->negNsSet->value = NULL;
13738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
13742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIntersectWildcards:
13747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild:  the first wildcard
13749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @curWild: the second wildcard
13750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Intersects the namespace constraints of the given wildcards.
13752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @completeWild will hold the resulting intersection.
13753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a positive error code on failure, -1 in case of an
13754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * internal error, 0 otherwise.
13755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIntersectWildcards(xmlSchemaParserCtxtPtr ctxt,
13758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr completeWild,
13759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaWildcardPtr curWild)
13760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardNsPtr cur, curB, prev,  tmp;
13762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If O1 and O2 are the same value, then that value must be the
13765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * value.
13766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any == curWild->any) &&
13768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->nsSet == NULL) == (curWild->nsSet == NULL)) &&
13769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((completeWild->negNsSet == NULL) == (curWild->negNsSet == NULL))) {
13770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((completeWild->negNsSet == NULL) ||
13772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (completeWild->negNsSet->value == curWild->negNsSet->value)) {
13773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (completeWild->nsSet != NULL) {
13775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int found = 0;
13776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
13778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Check equality of sets.
13779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
13780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = completeWild->nsSet;
13781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (cur != NULL) {
13782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 0;
13783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curWild->nsSet;
13784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (curB != NULL) {
13785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (cur->value == curB->value) {
13786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
13787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
13788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
13789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curB = curB->next;
13790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (!found)
13792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    cur = cur->next;
13794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (found)
13796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(0);
13797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
13798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
13799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 If either O1 or O2 is any, then the other must be the value.
13803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->any != curWild->any) && (completeWild->any)) {
13805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
13807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 If either O1 or O2 is a pair of not and a value (a namespace
1381160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * name or �absent�) and the other is a set of (namespace names or
1381260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * �absent�), then that set, minus the negated value if it was in
1381360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the set, minus �absent� if it was in the set, must be the value.
13814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((completeWild->negNsSet != NULL) && (curWild->nsSet != NULL)) ||
13816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((curWild->negNsSet != NULL) && (completeWild->nsSet != NULL))) {
13817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *neg;
13818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (completeWild->nsSet == NULL) {
13820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = completeWild->negNsSet->value;
13821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCloneWildcardNsConstraints(ctxt, completeWild, curWild) == -1)
13822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
13823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
13824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    neg = curWild->negNsSet->value;
13825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Remove absent and negated.
13827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = NULL;
13829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = completeWild->nsSet;
13830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->value == NULL) {
13832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prev == NULL)
13833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = cur->next;
13834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
13835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prev->next = cur->next;
13836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(cur);
13837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
13838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
13840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (neg != NULL) {
13843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = NULL;
13844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = completeWild->nsSet;
13845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
13846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == neg) {
13847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (prev == NULL)
13848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			completeWild->nsSet = cur->next;
13849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
13850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prev->next = cur->next;
13851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(cur);
13852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prev = cur;
13855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
13856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1386260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 4 If both O1 and O2 are sets of (namespace names or �absent�),
13863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the intersection of those sets must be the value.
13864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->nsSet != NULL) && (curWild->nsSet != NULL)) {
13866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
13867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = completeWild->nsSet;
13869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = NULL;
13870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
13871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
13872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    curB = curWild->nsSet;
13873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (curB != NULL) {
13874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == curB->value) {
13875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
13876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
13877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = curB->next;
13879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
13881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prev == NULL)
13882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    completeWild->nsSet = cur->next;
13883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
13884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prev->next = cur->next;
13885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		tmp = cur->next;
13886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(cur);
13887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = tmp;
13888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
13889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prev = cur;
13891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
13892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
13895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 5 If the two are negations of different namespace names,
13897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then the intersection is not expressible
13898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) &&
13900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet != NULL) &&
13901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
13902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != NULL) &&
13903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(curWild->negNsSet->value != NULL)) {
13904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPErr(ctxt, completeWild->node, XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE,
13906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The intersection of the wilcard is not expressible.\n",
13907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, NULL);
13908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_SCHEMAP_INTERSECTION_NOT_EXPRESSIBLE);
13909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 6 If the one is a negation of a namespace name and the other
1391260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * is a negation of �absent�, then the one which is the negation
13913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a namespace name must be the value.
13914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((completeWild->negNsSet != NULL) && (curWild->negNsSet != NULL) &&
13916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value != curWild->negNsSet->value) &&
13917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(completeWild->negNsSet->value == NULL)) {
13918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	completeWild->negNsSet->value =  curWild->negNsSet->value;
13919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
13921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
13924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsWildcardNsConstraintSubset:
13925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
13926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sub:  the first wildcard
13927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @super: the second wildcard
13928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Wildcard Subset (cos-ns-subset)
13930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the namespace constraint of @sub is an intensional
13932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * subset of @super, 1 otherwise.
13933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
13934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSNSSubset(xmlSchemaWildcardPtr sub,
13936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaWildcardPtr super)
13937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
13938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
13939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 super must be any.
13940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (super->any)
13942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1394460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.1 sub must be a pair of not and a namespace name or �absent�.
13945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2 super must be a pair of not and the same value.
13946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((sub->negNsSet != NULL) &&
13948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(super->negNsSet != NULL) &&
13949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(sub->negNsSet->value == sub->negNsSet->value))
13950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
13951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1395260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 3.1 sub must be a set whose members are either namespace names or �absent�.
13953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
13954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sub->nsSet != NULL) {
13955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
13956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.2.1 super must be the same set or a superset thereof.
13957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
13958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (super->nsSet != NULL) {
13959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr cur, curB;
13960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int found = 0;
13961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = sub->nsSet;
13963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
13964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 0;
13965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curB = super->nsSet;
13966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (curB != NULL) {
13967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->value == curB->value) {
13968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			found = 1;
13969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
13970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
13971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curB = curB->next;
13972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
13973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (!found)
13974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (1);
13975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
13976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found)
13978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
13979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (super->negNsSet != NULL) {
13980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaWildcardNsPtr cur;
13981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
13982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.2.2 super must be a pair of not and a namespace name or
1398360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �absent� and that value must not be in sub's set.
13984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
13985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = sub->nsSet;
13986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (cur != NULL) {
13987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (cur->value == super->negNsSet->value)
13988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (1);
13989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = cur->next;
13990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
13991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
13992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
13993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
13994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
13995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
13996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
13997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
13998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetEffectiveValueConstraint(xmlSchemaAttributeUsePtr attruse,
13999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     int *fixed,
14000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     const xmlChar **value,
14001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaValPtr *val)
14002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *fixed = 0;
14004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *value = NULL;
14005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != 0)
14006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*val = NULL;
14007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1400860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (attruse->defValue != NULL) {
14009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = attruse->defValue;
14010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val != NULL)
14011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = attruse->defVal;
14012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attruse->flags & XML_SCHEMA_ATTR_USE_FIXED)
14013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *fixed = 1;
14014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
14015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((attruse->attrDecl != NULL) &&
14016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(attruse->attrDecl->defValue != NULL)) {
14017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*value = attruse->attrDecl->defValue;
14018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (val != NULL)
14019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = attruse->attrDecl->defVal;
14020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attruse->attrDecl->flags & XML_SCHEMAS_ATTR_FIXED)
14021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *fixed = 1;
14022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(1);
14023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCVCWildcardNamespace:
14028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @wild:  the wildcard
14029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the namespace
14030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation Rule: Wildcard allows Namespace Name
14032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (cvc-wildcard-namespace)
14033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the given namespace matches the wildcard,
14035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1 otherwise and -1 on API errors.
14036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCVCWildcardNamespace(xmlSchemaWildcardPtr wild,
14039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar* ns)
14040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild == NULL)
14042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
14043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->any)
14045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (wild->nsSet != NULL) {
14047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaWildcardNsPtr cur;
14048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = wild->nsSet;
14050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
14051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->value, ns))
14052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
14053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((wild->negNsSet != NULL) && (ns != NULL) &&
14056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlStrEqual(wild->negNsSet->value, ns)))
14057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
14060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ACTION_DERIVE 0
14063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_ACTION_REDEFINE 1
14064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_ACTION_STR(a) \
14066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project((a) == XML_SCHEMA_ACTION_DERIVE) ? (const xmlChar *) "base" : (const xmlChar *) "redefined"
14067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
14069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Schema Component Constraint:
14070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Derivation Valid (Restriction, Complex)
14071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   derivation-ok-restriction (2) - (4)
14072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* ATTENTION:
14074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* In XML Schema 1.1 this will be:
14075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Validation Rule:
14076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*     Checking complex type subsumption (practicalSubsumption) (1, 2 and 3)
14077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
14079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckDerivationOKRestriction2to4(xmlSchemaParserCtxtPtr pctxt,
14081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       int action,
14082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr item,
14083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaBasicItemPtr baseItem,
14084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaItemListPtr uses,
14085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaItemListPtr baseUses,
14086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaWildcardPtr wild,
14087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaWildcardPtr baseWild)
1408860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
14089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr cur = NULL, bcur;
14090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, found; /* err = 0; */
14091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *bEffValue;
14092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int effFixed;
1409360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (uses != NULL) {
14095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < uses->nbItems; i++) {
14096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = uses->items[i];
14097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
14098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (baseUses == NULL)
14099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto not_found;
14100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < baseUses->nbItems; j++) {
1410160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		bcur = baseUses->items[j];
14102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ATTRUSE_DECL_NAME(cur) ==
14103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(bcur)) &&
14104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTRUSE_DECL_TNS(cur) ==
14105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(bcur)))
14106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
14107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * (2.1) "If there is an attribute use in the {attribute
14109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * uses} of the {base type definition} (call this B) whose
14110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * {attribute declaration} has the same {name} and {target
14111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * namespace}, then  all of the following must be true:"
14112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    found = 1;
1411460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((cur->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
14116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(bcur->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED))
14117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
14118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
14119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1) "one of the following must be true:"
14121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1.1) "B's {required} is false."
14122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* (2.1.1.2) "R's {required} is true."
14123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPAttrUseErr4(pctxt,
14125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_1,
14126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item), item, cur,
14127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The 'optional' attribute use is inconsistent "
14128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "with the corresponding 'required' attribute use of "
14129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "the %s %s",
14130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ACTION_STR(action),
14131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, baseItem),
14132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, NULL);
14133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
14134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* err = pctxt->err; */
14135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else if (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
14136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_TYPEDEF(cur),
14137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_TYPEDEF(bcur), 0) != 0)
14138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
14139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
1414060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (2.1.2) "R's {attribute declaration}'s
14143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* {type definition} must be validly derived from
14144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* B's {type definition} given the empty set as
1414560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* defined in Type Derivation OK (Simple) (�3.14.6)."
14146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPAttrUseErr4(pctxt,
14148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_2,
14149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item), item, cur,
14150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The attribute declaration's %s "
14151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "is not validly derived from "
14152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "the corresponding %s of the "
14153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "attribute declaration in the %s %s",
14154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strA,
14155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(cur)),
14156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strB,
14157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(bcur)),
14158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ACTION_STR(action),
14159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strC, baseItem));
14160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* xmlSchemaGetComponentDesignation(&str, baseItem), */
14161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strA);
14162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strB);
14163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strC);
14164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* err = pctxt->err; */
14165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
14166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* 2.1.3 [Definition:]  Let the effective value
14168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* constraint of an attribute use be its {value
14169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* constraint}, if present, otherwise its {attribute
14170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* declaration}'s {value constraint} .
14171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetEffectiveValueConstraint(bcur,
14173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    &effFixed, &bEffValue, NULL);
14174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
14175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* 2.1.3 ... one of the following must be true
14176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*
1417760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* 2.1.3.1 B's �effective value constraint� is
1417860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* �absent� or default.
14179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
14180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((bEffValue != NULL) &&
14181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (effFixed == 1)) {
14182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *rEffValue = NULL;
1418360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetEffectiveValueConstraint(bcur,
14185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				&effFixed, &rEffValue, NULL);
14186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
1418760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * 2.1.3.2 R's �effective value constraint� is
14188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * fixed with the same string as B's.
14189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * MAYBE TODO: Compare the computed values.
14190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *       Hmm, it says "same string" so
14191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    *       string-equality might really be sufficient.
14192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
14193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if ((effFixed == 0) ||
14194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				(! WXS_ARE_DEFAULT_STR_EQUAL(rEffValue, bEffValue)))
14195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    {
14196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlChar *str = NULL;
1419760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPAttrUseErr4(pctxt,
14199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_1_3,
14200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    WXS_ITEM_NODE(item), item, cur,
14201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "The effective value constraint of the "
14202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "attribute use is inconsistent with "
14203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "its correspondent in the %s %s",
14204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    WXS_ACTION_STR(action),
14205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaGetComponentDesignation(&str,
14206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					baseItem),
14207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    NULL, NULL);
14208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(str);
14209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/* err = pctxt->err; */
14210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
14211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
14214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1421660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottnot_found:
14217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
14218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (2.2) "otherwise the {base type definition} must have an
14220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {attribute wildcard} and the {target namespace} of the
1422160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* R's {attribute declaration} must be �valid� with respect
14222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to that wildcard, as defined in Wildcard allows Namespace
1422360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Name (�3.10.4)."
14224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((baseWild == NULL) ||
14226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaCheckCVCWildcardNamespace(baseWild,
14227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTRUSE_DECL(cur))->targetNamespace) != 0))
14228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
14229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
1423060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPAttrUseErr4(pctxt,
14232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_DERIVATION_OK_RESTRICTION_2_2,
14233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(item), item, cur,
14234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Neither a matching attribute use, "
14235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"nor a matching wildcard exists in the %s %s",
14236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ACTION_STR(action),
14237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentDesignation(&str, baseItem),
14238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
14239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
14240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* err = pctxt->err; */
14241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1424660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC derivation-ok-restriction (3):
14247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (3) "For each attribute use in the {attribute uses} of the {base type
14248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition} whose {required} is true, there must be an attribute
14249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * use with an {attribute declaration} with the same {name} and
14250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {target namespace} as its {attribute declaration} in the {attribute
14251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * uses} of the complex type definition itself whose {required} is true.
14252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseUses != NULL) {
14254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (j = 0; j < baseUses->nbItems; j++) {
14255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bcur = baseUses->items[j];
14256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bcur->occurs != XML_SCHEMAS_ATTR_USE_REQUIRED)
14257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
14259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (uses != NULL) {
14260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < uses->nbItems; i++) {
1426160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    cur = uses->items[i];
14262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(cur) ==
14263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(bcur)) &&
14264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(cur) ==
14265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(bcur))) {
14266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			found = 1;
14267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
14268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!found) {
14272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL;
1427360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_3,
14276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, item,
14277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "A matching attribute use for the "
14278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'required' %s of the %s %s is missing",
14279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strA, bcur),
14280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ACTION_STR(action),
14281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strB, baseItem),
14282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
14283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA);
14284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB);
14285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * derivation-ok-restriction (4)
14290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild != NULL) {
14292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (4) "If there is an {attribute wildcard}, all of the
14294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* following must be true:"
1429560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
14296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (baseWild == NULL) {
14297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4.1) "The {base type definition} must also have one."
1430160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
14302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_1,
14304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, item,
14305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The %s has an attribute wildcard, "
14306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"but the %s %s '%s' does not have one",
1430760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		WXS_ITEM_TYPE_NAME(item),
14308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem));
14311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
14312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
14313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((baseWild->any == 0) &&
14314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckCOSNSSubset(wild, baseWild))
14315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
14316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4.2) "The complex type definition's {attribute wildcard}'s
14319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {namespace constraint} must be a subset of the {base type
14320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition}'s {attribute wildcard}'s {namespace constraint},
1432160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * as defined by Wildcard Subset (�3.10.6)."
14322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_2,
14325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, item,
14326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The attribute wildcard is not a valid "
14327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"subset of the wildcard in the %s %s '%s'",
14328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem),
14331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
14332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
14333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
14334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1433560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* 4.3 Unless the {base type definition} is the �ur-type
1433660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* definition�, the complex type definition's {attribute
14337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* wildcard}'s {process contents} must be identical to or
14338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* stronger than the {base type definition}'s {attribute
14339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* wildcard}'s {process contents}, where strict is stronger
14340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* than lax is stronger than skip.
14341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_IS_ANYTYPE(baseItem)) &&
14343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (wild->processContents < baseWild->processContents)) {
14344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
14345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
14346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_4_3,
14347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, baseItem,
14348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The {process contents} of the attribute wildcard is "
14349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"weaker than the one in the %s %s '%s'",
14350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ACTION_STR(action),
14351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(baseItem),
14352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, baseItem),
14353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
14354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
14355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(pctxt->err);
14356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
14364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaBasicItemPtr item,
14365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaWildcardPtr *completeWild,
14366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr list,
14367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr prohibs);
14368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFixupTypeAttributeUses:
14370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
14371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
14372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Builds the wildcard and the attribute uses on the given complex type.
14375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 if an internal error occurs, 0 otherwise.
14376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ATTENTION TODO: Experimantally this uses pointer comparisons for
14378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * strings, so recheck this if we start to hardcode some schemata, since
14379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * they might not be in the same dict.
14380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: It is allowed to "extend" the xs:anyType type.
14381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupTypeAttributeUses(xmlSchemaParserCtxtPtr pctxt,
14384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaTypePtr type)
14385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = NULL;
1438760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttributeUsePtr use;
14388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr uses, baseUses, prohibs = NULL;
14389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == NULL) {
14391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no base type");
14393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
14394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1439560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    baseType = type->baseType;
14396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
14397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt) == -1)
14398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    uses = type->attrUses;
14401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    baseUses = baseType->attrUses;
14402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Expand attribute group references. And build the 'complete'
14404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard, i.e. intersect multiple wildcards.
14405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Move attribute prohibitions into a separate list.
14406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1440760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (uses != NULL) {
14408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
14409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
14410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one will transfer all attr. prohibitions
14411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * into pctxt->attrProhibs.
14412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
14415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pctxt->attrProhibs) == -1)
14416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to expand attributes");
14419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pctxt->attrProhibs->nbItems != 0)
14421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prohibs = pctxt->attrProhibs;
14422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaExpandAttributeGroupRefs(pctxt,
14424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, &(type->attributeWildcard), uses,
14425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL) == -1)
14426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaFixupTypeAttributeUses",
14428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to expand attributes");
14429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Inherit the attribute uses of the base type.
14434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseUses != NULL) {
14436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j;
14437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUseProhibPtr pro;
14438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
14440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int usesCount;
1444160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlSchemaAttributeUsePtr tmp;
14442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (uses != NULL)
14444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		usesCount = uses->nbItems;
14445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		usesCount = 0;
14447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Restriction. */
14449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < baseUses->nbItems; i++) {
14450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = baseUses->items[i];
14451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (prohibs) {
14452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Filter out prohibited uses.
14454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < prohibs->nbItems; j++) {
14456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			pro = prohibs->items[j];
14457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) == pro->name) &&
14458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
14459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				pro->targetNamespace))
14460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
14461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto inherit_next;
14462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (usesCount) {
14466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
14467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Filter out existing uses.
14468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
14469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < usesCount; j++) {
14470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmp = uses->items[j];
14471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) ==
14472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_NAME(tmp)) &&
14473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
14474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_TNS(tmp)))
14475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
14476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto inherit_next;
14477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
14478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
14479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (uses == NULL) {
14481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->attrUses = xmlSchemaItemListCreate();
14482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->attrUses == NULL)
14483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
14484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uses = type->attrUses;
14485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
14486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaItemListAddSize(uses, 2, use);
14487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinherit_next: {}
14488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Extension. */
1449160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    for (i = 0; i < baseUses->nbItems; i++) {
1449260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		use = baseUses->items[i];
14493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (uses == NULL) {
14494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->attrUses = xmlSchemaItemListCreate();
14495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->attrUses == NULL)
14496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
14497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uses = type->attrUses;
14498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
1449960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaItemListAddSize(uses, baseUses->nbItems, use);
14500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Shrink attr. uses.
14505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (uses) {
14507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (uses->nbItems == 0) {
14508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(uses);
14509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->attrUses = NULL;
14510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We could shrink the size of the array
14513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to fit the actual number of items.
14514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Compute the complete wildcard.
14518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1451960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (WXS_IS_EXTENSION(type)) {
14520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (baseType->attributeWildcard != NULL) {
14521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1452260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2.1) "If the �base wildcard� is non-�absent�, then
14523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the appropriate case among the following:"
14524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->attributeWildcard != NULL) {
14526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Union the complete wildcard with the base wildcard.
14528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC {attribute wildcard}
14529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (3.2.2.1.2) "otherwise a wildcard whose {process contents}
1453060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* and {annotation} are those of the �complete wildcard�,
14531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and whose {namespace constraint} is the intensional union
1453260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* of the {namespace constraint} of the �complete wildcard�
1453360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* and of the �base wildcard�, as defined in Attribute
1453460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Wildcard Union (�3.10.6)."
14535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaUnionWildcards(pctxt, type->attributeWildcard,
14537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    baseType->attributeWildcard) == -1)
1453860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    goto exit_failure;
14539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
14540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1454160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (3.2.2.1.1) "If the �complete wildcard� is �absent�,
1454260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* then the �base wildcard�."
14543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->attributeWildcard = baseType->attributeWildcard;
1454560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
14546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
14547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
1454860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2.2) "otherwise (the �base wildcard� is �absent�) the
1454960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �complete wildcard"
14550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOOP
14551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
14552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC {attribute wildcard}
14556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (3.1) "If the <restriction> alternative is chosen, then the
1455760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �complete wildcard�;"
14558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOOP
14559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1456160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
14563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
14565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
14566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeFinalContains:
14570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  the schema
14571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type definition
14572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @final: the final
14573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates if a type definition contains the given "final".
14575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This does take "finalDefault" into account as well.
14576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the type does containt the given "final",
14578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 otherwise.
14579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFinalContains(xmlSchemaTypePtr type, int final)
14582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
14584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->flags & final)
14586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
14587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
14588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetUnionSimpleTypeMemberTypes:
14593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the Union Simple Type
14594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of member types of @type if existing,
14596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns NULL otherwise.
14597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTypeLinkPtr
14599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type)
14600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((type != NULL) && (type->type == XML_SCHEMA_TYPE_SIMPLE)) {
14602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->memberTypes != NULL)
14603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (type->memberTypes);
14604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
14605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = type->baseType;
14606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
14608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParticleTotalRangeMin:
14612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Effective Total Range
14615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (all and sequence) + (choice)
14616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the minimun Effective Total Range.
14618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParticleTotalRangeMin(xmlSchemaParticlePtr particle)
14621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle->children == NULL) ||
14623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->minOccurs == 0))
14624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int min = -1, cur;
14627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (part == NULL)
14631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
14632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (part != NULL) {
14633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->minOccurs;
14636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMin(part);
14638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == 0)
14639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
14640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((min > cur) || (min == -1))
14641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		min = cur;
14642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) part->next;
14643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->minOccurs * min);
14645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <all> and <sequence> */
14647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int sum = 0;
14648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (part == NULL)
14652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
14653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
14654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sum += part->minOccurs;
14657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sum += xmlSchemaGetParticleTotalRangeMin(part);
14659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    part = (xmlSchemaParticlePtr) part->next;
14660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (part != NULL);
14661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->minOccurs * sum);
14662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1466560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if 0
14666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParticleTotalRangeMax:
14668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Effective Total Range
14671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (all and sequence) + (choice)
14672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the maximum Effective Total Range.
14674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParticleTotalRangeMax(xmlSchemaParticlePtr particle)
14677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle->children == NULL) ||
14679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->children->children == NULL))
14680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (particle->children->type == XML_SCHEMA_TYPE_CHOICE) {
14682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int max = -1, cur;
14683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
14687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part->children == NULL)
14688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->maxOccurs;
14692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMax(part);
14694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == UNBOUNDED)
14695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((max < cur) || (max == -1))
14697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		max = cur;
14698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Handle overflows? */
14700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->maxOccurs * max);
14701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
14702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* <all> and <sequence> */
14703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int sum = 0, cur;
14704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr part =
14705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) particle->children->children;
14706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; part != NULL; part = (xmlSchemaParticlePtr) part->next) {
14708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (part->children == NULL)
14709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
14710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((part->children->type == XML_SCHEMA_TYPE_ELEMENT) ||
14711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(part->children->type == XML_SCHEMA_TYPE_ANY))
14712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = part->maxOccurs;
14713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
14714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur = xmlSchemaGetParticleTotalRangeMax(part);
14715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur == UNBOUNDED)
14716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur > 0) && (particle->maxOccurs == UNBOUNDED))
14718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (UNBOUNDED);
14719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sum += cur;
14720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Handle overflows? */
14722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (particle->maxOccurs * sum);
14723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1472560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
14726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsParticleEmptiable:
14729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the particle
14730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Particle Emptiable
14732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks whether the given particle is emptiable.
14733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if emptiable, 0 otherwise.
14735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsParticleEmptiable(xmlSchemaParticlePtr particle)
14738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "Its {min occurs} is 0."
14741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((particle == NULL) || (particle->minOccurs == 0) ||
14743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(particle->children == NULL))
14744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
14745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "Its {term} is a group and the minimum part of the
14747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * effective total range of that group, [...] is 0."
14748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_MODEL_GROUP(particle->children)) {
14750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaGetParticleTotalRangeMin(particle) == 0)
14751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
14752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
14754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSSTDerivedOK:
14758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @actxt: a context
14759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the derived simple type definition
14760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base type definition
14761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @subset: the subset of ('restriction', ect.)
14762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
14764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Simple) (cos-st-derived-OK)
14765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks wheter @type can be validly
14767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * derived from @baseType.
14768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, an positive error code otherwise.
14770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
14773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
14774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
14775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int subset)
14776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 They are the same type definition.
14779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: The identy check might have to be more complex than this.
14780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == baseType)
14782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.1 restriction is not in the subset, or in the {final}
14785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of its own {base type definition};
14786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that this will be used also via "xsi:type".
14788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Revise this, it looks strange. How can the "type"
14790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not be fixed or *in* fixing?
14791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(type))
14793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(type, actxt) == -1)
14794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
14796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFixup(baseType, actxt) == -1)
14797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
14798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((subset & SUBSET_RESTRICTION) ||
14799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaTypeFinalContains(type->baseType,
14800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION))) {
14801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_1);
14802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* 2.2 */
14804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == baseType) {
14805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1480660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 2.2.1 D's �base type definition� is B.
14807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1481160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.2 D's �base type definition� is not the �ur-type definition�
14812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * and is validly derived from B given the subset, as defined by this
14813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * constraint.
14814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! WXS_IS_ANYTYPE(type->baseType)) &&
14816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
14817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, subset) == 0)) {
14818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1482160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.3 D's {variety} is list or union and B is the �simple ur-type
1482260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�.
14823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANY_SIMPLE_TYPE(baseType) &&
14825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_LIST(type) || WXS_IS_UNION(type))) {
14826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2.4 B's {variety} is union and D is validly derived from a type
14830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition in B's {member type definitions} given the subset, as
14831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * defined by this constraint.
14832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
14833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: This seems not to involve built-in types, since there is no
14834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * built-in Union Simple Type.
14835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
14836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_UNION(baseType)) {
14837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr cur;
14838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = baseType->memberTypes;
14840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (cur != NULL) {
14841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(cur->type))
14842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaTypeFixup(cur->type, actxt) == -1)
14843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
14844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSSTDerivedOK(actxt,
14845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type, cur->type, subset) == 0)
14846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
14848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* It just has to be validly derived from at least one
14849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* member-type.
14850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
14851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
14852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = cur->next;
14854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_SCHEMAP_COS_ST_DERIVED_OK_2_2);
14857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckTypeDefCircularInternal:
14861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context
14862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtType:  the type definition
14863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ancestor: an ancestor of @ctxtType
14864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks st-props-correct (2) + ct-props-correct (3).
14866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Circular type definitions are not allowed.
14867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns XML_SCHEMAP_ST_PROPS_CORRECT_2 if the given type is
14869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * circular, 0 otherwise.
14870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckTypeDefCircularInternal(xmlSchemaParserCtxtPtr pctxt,
14873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr ctxtType,
14874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr ancestor)
14875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
14877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ancestor == NULL) || (ancestor->type == XML_SCHEMA_TYPE_BASIC))
14879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxtType == ancestor) {
14882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(pctxt,
14883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_2,
14884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST ctxtType, WXS_ITEM_NODE(ctxtType),
14885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The definition is circular", NULL);
14886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_2);
14887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ancestor->flags & XML_SCHEMAS_TYPE_MARKED) {
14889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
14890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Avoid inifinite recursion on circular types not yet checked.
14891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
14892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
14893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ancestor->flags |= XML_SCHEMAS_TYPE_MARKED;
14895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckTypeDefCircularInternal(pctxt, ctxtType,
14896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ancestor->baseType);
14897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ancestor->flags ^= XML_SCHEMAS_TYPE_MARKED;
14898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
14899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckTypeDefCircular:
14903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the complex/simple type definition
14904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
14905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
14906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular type definitions.
14908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckTypeDefCircular(xmlSchemaTypePtr item,
14911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaParserCtxtPtr ctxt)
14912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((item == NULL) ||
14914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->type == XML_SCHEMA_TYPE_BASIC) ||
14915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->baseType == NULL))
14916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
14917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckTypeDefCircularInternal(ctxt, item,
14918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->baseType);
14919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
14922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Simple Type Definition Representation OK (src-simple-type) 4
14923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* "4 Circular union type definition is disallowed. That is, if the
14925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* <union> alternative is chosen, there must not be any entries in the
14926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* memberTypes [attribute] at any depth which resolve to the component
14927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* corresponding to the <simpleType>."
14928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
14929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Note that this should work on the *representation* of a component,
14930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* thus assumes any union types in the member types not being yet
14931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* substituted. At this stage we need the variety of the types
14932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* to be already computed.
14933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
14934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckUnionTypeDefCircularRecur(xmlSchemaParserCtxtPtr pctxt,
14936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					xmlSchemaTypePtr ctxType,
14937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					xmlSchemaTypeLinkPtr members)
1493860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
14939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr member;
14940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr memberType;
1494160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
14942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    member = members;
14943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (member != NULL) {
14944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberType = member->type;
14945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((memberType != NULL) &&
14946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (memberType->type != XML_SCHEMA_TYPE_BASIC)) {
14947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (memberType == ctxType) {
14948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
14949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_SIMPLE_TYPE_4,
14950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST ctxType, NULL,
14951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The union type definition is circular", NULL);
14952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_SRC_SIMPLE_TYPE_4);
14953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_IS_UNION(memberType)) &&
14955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((memberType->flags & XML_SCHEMAS_TYPE_MARKED) == 0))
14956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
14957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int res;
14958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memberType->flags |= XML_SCHEMAS_TYPE_MARKED;
14959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = xmlSchemaCheckUnionTypeDefCircularRecur(pctxt,
14960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxType,
14961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetUnionSimpleTypeMemberTypes(memberType));
14962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		memberType->flags ^= XML_SCHEMAS_TYPE_MARKED;
14963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (res != 0)
14964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(res);
14965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
14966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memberType = memberType->baseType;
14967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
14968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	member = member->next;
14969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
14970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
14971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
14974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckUnionTypeDefCircular(xmlSchemaParserCtxtPtr pctxt,
14975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaTypePtr type)
14976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_UNION(type))
14978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
14979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaCheckUnionTypeDefCircularRecur(pctxt, type,
14980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->memberTypes));
14981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
14982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
14984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveTypeReferences:
14985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the complex/simple type definition
14986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
14987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
14988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
14989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolvese type definition references
14990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
14991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
14992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveTypeReferences(xmlSchemaTypePtr typeDef,
14993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaParserCtxtPtr ctxt)
14994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
14995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDef == NULL)
14996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
14997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
14999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve the base type.
15000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDef->baseType == NULL) {
15002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	typeDef->baseType = xmlSchemaGetType(ctxt->schema,
15003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    typeDef->base, typeDef->baseNs);
15004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef->baseType == NULL) {
15005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
15006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
15007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST typeDef, typeDef->node,
15008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"base", typeDef->base, typeDef->baseNs,
15009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL);
15010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(typeDef)) {
15014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_UNION(typeDef)) {
15015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Resolve the memberTypes.
15017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaResolveUnionMemberTypes(ctxt, typeDef);
15019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_LIST(typeDef)) {
15021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Resolve the itemType.
15023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((typeDef->subtypes == NULL) && (typeDef->base != NULL)) {
15025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		typeDef->subtypes = xmlSchemaGetType(ctxt->schema,
15027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    typeDef->base, typeDef->baseNs);
15028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((typeDef->subtypes == NULL) ||
15030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (! WXS_IS_SIMPLE(typeDef->subtypes)))
15031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
15032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    typeDef->subtypes = NULL;
15033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPResCompAttrErr(ctxt,
15034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_RESOLVE,
15035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST typeDef, typeDef->node,
15036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"itemType", typeDef->base, typeDef->baseNs,
15037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SIMPLE, NULL);
15038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
15041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1504260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
15043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The ball of letters below means, that if we have a particle
15045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which has a QName-helper component as its {term}, we want
15046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to resolve it...
15047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((WXS_TYPE_CONTENTTYPE(typeDef) != NULL) &&
15049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_TYPE_CONTENTTYPE(typeDef))->type ==
15050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_PARTICLE) &&
15051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_TYPE_PARTICLE_TERM(typeDef) != NULL) &&
15052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_TYPE_PARTICLE_TERM(typeDef))->type ==
15053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_EXTRA_QNAMEREF))
15054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
15055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref =
15056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_QNAME_CAST WXS_TYPE_PARTICLE_TERM(typeDef);
15057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaModelGroupDefPtr groupDef;
15058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: Test this.
15061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_TYPE_PARTICLE_TERM(typeDef) = NULL;
15063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Resolve the MG definition reference.
15065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	groupDef =
15067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_MODEL_GROUPDEF_CAST xmlSchemaGetNamedComponent(ctxt->schema,
15068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref->itemType, ref->name, ref->targetNamespace);
15069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (groupDef == NULL) {
15070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
15071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)),
15072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"ref", ref->name, ref->targetNamespace, ref->itemType,
15073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
15074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove the particle. */
15075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
15076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_MODELGROUPDEF_MODEL(groupDef) == NULL)
15077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Remove the particle. */
15078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_CONTENTTYPE(typeDef) = NULL;
15079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
15080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Assign the MG definition's {model group} to the
15082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * particle's {term}.
15083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TYPE_PARTICLE_TERM(typeDef) = WXS_MODELGROUPDEF_MODEL(groupDef);
1508560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_MODELGROUPDEF_MODEL(groupDef)->type == XML_SCHEMA_TYPE_ALL) {
15087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1.2)
15089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "1.2 the {term} property of a particle with
15090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {max occurs}=1 which is part of a pair which constitutes
15091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the {content type} of a complex type definition."
15092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_PARTICLE(typeDef))->maxOccurs != 1) {
15094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
15095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
15096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
15097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(WXS_TYPE_PARTICLE(typeDef)), NULL,
15098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The particle's {max occurs} must be 1, since the "
15099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"reference resolves to an 'all' model group",
15100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
15101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSTPropsCorrect:
15111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks st-props-correct.
15115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the properties are correct,
15117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not, a positive error code and -1 on internal
15118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSTPropsCorrect(xmlSchemaParserCtxtPtr ctxt,
15122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = type->baseType;
15125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
15126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* STATE: error funcs converted. */
15128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Definition Properties Correct
15130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: This is somehow redundant, since we actually built a simple type
15132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to have all the needed information; this acts as an self test.
15133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1513460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* Base type: If the datatype has been �derived� by �restriction�
1513560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then the Simple Type Definition component from which it is �derived�,
1513660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * otherwise the Simple Type Definition for anySimpleType (�4.1.6).
15137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType == NULL) {
15139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Think about: "modulo the impact of Missing
1514160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Sub-components (�5.3)."
15142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No base type existent", NULL);
15147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_SIMPLE(baseType)) {
15151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The base type '%s' is not a simple type",
15155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15159df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((WXS_IS_LIST(type) || WXS_IS_UNION(type)) &&
15160df143a5041f03a22808b59c76698770b74692815Selim Gurun	(WXS_IS_RESTRICTION(type) == 0) &&
15161df143a5041f03a22808b59c76698770b74692815Selim Gurun	((! WXS_IS_ANY_SIMPLE_TYPE(baseType)) &&
15162df143a5041f03a22808b59c76698770b74692815Selim Gurun         (baseType->type != XML_SCHEMA_TYPE_SIMPLE))) {
15163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
1516660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "A type, derived by list or union, must have "
15167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the simple ur-type definition as base type, not '%s'",
15168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Variety: One of {atomic, list, union}.
15174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! WXS_IS_ATOMIC(type)) && (! WXS_IS_UNION(type)) &&
15176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! WXS_IS_LIST(type))) {
15177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_1,
15179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The variety is absent", NULL);
15181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_1);
15182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Finish this. Hmm, is this finished? */
15184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 The {final} of the {base type definition} must not contain restriction.
15187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaTypeFinalContains(baseType,
15189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
15191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_ST_PROPS_CORRECT_3,
15192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
15193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The 'final' of its base type '%s' must not contain "
15194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "'restriction'",
15195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetComponentQName(&str, baseType));
15196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
15197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_ST_PROPS_CORRECT_3);
15198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1520160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2 All simple type definitions must be derived ultimately from the �simple
1520260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * ur-type definition (so� circular definitions are disallowed). That is, it
1520360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be possible to reach a built-in primitive datatype or the �simple
1520460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * ur-type definition� by repeatedly following the {base type definition}.
15205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: this is done in xmlSchemaCheckTypeDefCircular().
15207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSSTRestricts:
15213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
15217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Restriction, Simple) (cos-st-restricts)
15218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks if the given @type (simpleType) is derived validly by restriction.
15220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
15221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 on internal errors, 0 if the type is validly derived,
15223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a positive error code otherwise.
15224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSSTRestricts(xmlSchemaParserCtxtPtr pctxt,
15227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *str = NULL;
15230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE) {
15232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "given type is not a user-derived simpleType");
15234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
15235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ATOMIC(type)) {
15238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr primitive;
15239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.1 The {base type definition} must be an atomic simple
15241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition or a built-in primitive datatype.
15242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_IS_ATOMIC(type->baseType)) {
15244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_1_1,
15246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The base type '%s' is not an atomic simple type",
15248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, type->baseType));
15249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_1);
15251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* 1.2 The {final} of the {base type definition} must not contain
15253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* restriction.
15254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* OPTIMIZE TODO : This is already done in xmlSchemaCheckStPropsCorrect */
15256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaTypeFinalContains(type->baseType,
15257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_1_2,
15260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The final of its base type '%s' must not contain 'restriction'",
15262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, type->baseType));
15263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_1_2);
15265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1.3.1 DF must be an allowed constraining facet for the {primitive
15269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition}, as specified in the appropriate subsection of 3.2
15270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Primitive datatypes.
15271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->facets != NULL) {
15273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetPtr facet;
15274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int ok = 1;
15275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    primitive = xmlSchemaGetPrimitiveType(type);
15277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (primitive == NULL) {
15278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to get primitive type");
15280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
15281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = type->facets;
15283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
15284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsBuiltInTypeFacet(primitive, facet->type) == 0) {
15285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ok = 0;
15286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPIllegalFacetAtomicErr(pctxt,
15287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1,
15288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type, primitive, facet);
15289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = facet->next;
15291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (facet != NULL);
15292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ok == 0)
15293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_1_3_1);
15294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.3.2) "If there is a facet of the same kind in the {facets}
15297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the {base type definition} (call this BF),then the DF's {value}
15298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a valid restriction of BF's {value} as defined in
15299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* [XML Schemas: Datatypes]."
15300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE (1.3.2) Facet derivation constraints are currently handled in
15302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* xmlSchemaDeriveAndValidateFacets()
15303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
15305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr itemType = NULL;
15306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	itemType = type->subtypes;
15308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((itemType == NULL) || (! WXS_IS_SIMPLE(itemType))) {
15309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to evaluate the item type");
15311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
15312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED(itemType))
15314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeFixup(itemType, ACTXT_CAST pctxt);
15315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2.1 The {item type definition} must have a {variety} of atomic or
15317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* union (in which case all the {member type definitions}
15318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be atomic).
15319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_IS_ATOMIC(itemType)) &&
15321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (! WXS_IS_UNION(itemType))) {
15322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
15324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
15325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The item type '%s' does not have a variety of atomic or union",
15326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, itemType));
15327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
15328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
15329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_UNION(itemType)) {
15330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeLinkPtr member;
15331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = itemType->memberTypes;
15333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (member != NULL) {
15334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! WXS_IS_ATOMIC(member->type)) {
15335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(pctxt,
15336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_2_1,
15337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The item type is a union type, but the "
15339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"member type '%s' of this item type is not atomic",
15340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, member->type));
15341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_1);
15343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member = member->next;
15345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_ANY_SIMPLE_TYPE(type->baseType)) {
15349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFacetPtr facet;
15350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is the case if we have: <simpleType><list ..
15352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1
15355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1.1 The {final} of the {item type definition} must not
15356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain list.
15357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(itemType,
15359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_LIST)) {
15360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1,
15362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The final of its item type '%s' must not contain 'list'",
15364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, itemType));
15365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_1);
15367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.1.2 The {facets} must only contain the whiteSpace
15370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * facet component.
15371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: the S4S already disallows any facet
15372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to be specified.
15373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (facet->type != XML_SCHEMA_FACET_WHITESPACE) {
15378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalFacetListUnionErr(pctxt,
15379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2,
15380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    type, facet);
15381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_1_2);
15382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * MAYBE TODO: (Hmm, not really) Datatypes states:
1538860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * A �list� datatype can be �derived� from an �atomic� datatype
1538960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * whose �lexical space� allows space (such as string or anyURI)or
1539060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * a �union� datatype any of whose {member type definitions}'s
1539160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �lexical space� allows space.
15392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
15394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This is the case if we have: <simpleType><restriction ...
15396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * I.e. the variety of "list" is inherited.
15397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2
15400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.1 The {base type definition} must have a {variety} of list.
15401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_IS_LIST(type->baseType)) {
15403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1,
15405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base type '%s' must be a list type",
15407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_1);
15410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.2 The {final} of the {base type definition} must not
15413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain restriction.
15414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(type->baseType,
15416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2,
15419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The 'final' of the base type '%s' must not contain 'restriction'",
15421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_2);
15424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 2.3.2.3 The {item type definition} must be validly derived
15427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * from the {base type definition}'s {item type definition} given
1542860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6).
15429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
15431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr baseItemType;
15432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		baseItemType = type->baseType->subtypes;
15434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((baseItemType == NULL) || (! WXS_IS_SIMPLE(baseItemType))) {
15435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to eval the item type of a base type");
15437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
15438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((itemType != baseItemType) &&
15440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt, itemType,
15441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			baseItemType, 0) != 0)) {
15442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *strBIT = NULL, *strBT = NULL;
15443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErrExt(pctxt,
15444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3,
15445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The item type '%s' is not validly derived from "
15447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"the item type '%s' of the base type '%s'",
15448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, itemType),
15449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strBIT, baseItemType),
15450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strBT, type->baseType));
15451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strBIT)
15454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strBT)
15455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_3);
15456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr facet;
15461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int ok = 1;
15462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.3.2.4 Only length, minLength, maxLength, whiteSpace, pattern
15464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* and enumeration facet components are allowed among the {facets}.
15465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    switch (facet->type) {
15469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_LENGTH:
15470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_MINLENGTH:
15471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_MAXLENGTH:
15472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_WHITESPACE:
15473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
15474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * TODO: 2.5.1.2 List datatypes
1547560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * The value of �whiteSpace� is fixed to the value collapse.
15476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
15477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_PATTERN:
15478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			case XML_SCHEMA_FACET_ENUMERATION:
15479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
15480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			default: {
15481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPIllegalFacetListUnionErr(pctxt,
15482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4,
15483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				type, facet);
15484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
15485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * We could return, but it's nicer to report all
15486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * invalid facets.
15487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
15488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ok = 0;
15489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
15490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ok == 0)
15494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_2_3_2_4);
15495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (2.3.2.5) (same as 1.3.2)
15497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
15498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE (2.3.2.5) This is currently done in
15499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xmlSchemaDeriveAndValidateFacets()
15500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
15504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 3.1 The {member type definitions} must all have {variety} of
15506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* atomic or list.
15507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr member;
15509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	member = type->memberTypes;
15511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (member != NULL) {
15512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(member->type))
15513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeFixup(member->type, ACTXT_CAST pctxt);
15514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((! WXS_IS_ATOMIC(member->type)) &&
15516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(! WXS_IS_LIST(member->type))) {
15517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_1,
15519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The member type '%s' is neither an atomic, nor a list type",
15521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, member->type));
15522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_1);
15524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = member->next;
15526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1552860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 3.3.1 If the {base type definition} is the �simple ur-type
1552960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* definition�
15530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseType->builtInType == XML_SCHEMAS_ANYSIMPLETYPE) {
15532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.1.1 All of the {member type definitions} must have a
15534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {final} which does not contain union.
15535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    member = type->memberTypes;
15537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (member != NULL) {
15538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaTypeFinalContains(member->type,
15539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_FINAL_UNION)) {
15540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(pctxt,
15541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1,
15542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
15543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The 'final' of member type '%s' contains 'union'",
15544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&str, member->type));
15545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
15546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1);
15547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		member = member->next;
15549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.1.2 The {facets} must be empty.
15552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facetSet != NULL) {
15554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2,
15556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "No facets allowed", NULL);
15558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_1_2);
15559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
15561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.1 The {base type definition} must have a {variety} of union.
15563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * I.e. the variety of "list" is inherited.
15564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_IS_UNION(type->baseType)) {
15566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1,
15568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base type '%s' is not a union type",
15570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_1);
15573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.2 The {final} of the {base type definition} must not contain restriction.
15576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaTypeFinalContains(type->baseType,
15578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_TYPE_FINAL_RESTRICTION)) {
15579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
15580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2,
15581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
15582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The 'final' of its base type '%s' must not contain 'restriction'",
15583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&str, type->baseType));
15584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
15585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_2);
15586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.3 The {member type definitions}, in order, must be validly
15589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the corresponding type definitions in the {base
15590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type definition}'s {member type definitions} given the empty set,
1559160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * as defined in Type Derivation OK (Simple) (�3.14.6).
15592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
15594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeLinkPtr baseMember;
15595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* OPTIMIZE: if the type is restricting, it has no local defined
15598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* member types and inherits the member types of the base type;
15599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* thus a check for equality can be skipped.
15600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
15602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Even worse: I cannot see a scenario where a restricting
15603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* union simple type can have other member types as the member
15604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* types of it's base type. This check seems not necessary with
15605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* respect to the derivation process in libxml2.
15606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* But necessary if constructing types with an API.
15607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
15608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->memberTypes != NULL) {
15609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    member = type->memberTypes;
15610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    baseMember = xmlSchemaGetUnionSimpleTypeMemberTypes(type->baseType);
15611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((member == NULL) && (baseMember != NULL)) {
15612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "different number of member types in base");
15614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (member != NULL) {
15616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (baseMember == NULL) {
15617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    PERROR_INT("xmlSchemaCheckCOSSTRestricts",
15618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "different number of member types in base");
15619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if ((member->type != baseMember->type) &&
15620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST pctxt,
15621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				member->type, baseMember->type, 0) != 0)) {
15622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlChar *strBMT = NULL, *strBT = NULL;
15623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPCustomErrExt(pctxt,
15625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3,
15626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_BASIC_CAST type, NULL,
15627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The member type %s is not validly "
15628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"derived from its corresponding member "
15629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"type %s of the base type %s",
15630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&str, member->type),
15631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&strBMT, baseMember->type),
15632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaGetComponentQName(&strBT, type->baseType));
15633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(str)
15634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(strBMT)
15635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FREE_AND_NULL(strBT)
15636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_3);
15637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
15638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			member = member->next;
15639df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (baseMember != NULL)
15640df143a5041f03a22808b59c76698770b74692815Selim Gurun                            baseMember = baseMember->next;
15641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 3.3.2.4 Only pattern and enumeration facet components are
15646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * allowed among the {facets}.
15647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->facets != NULL) {
15649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetPtr facet;
15650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int ok = 1;
15651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facet = type->facets;
15653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
15654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((facet->type != XML_SCHEMA_FACET_PATTERN) &&
15655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(facet->type != XML_SCHEMA_FACET_ENUMERATION)) {
15656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaPIllegalFacetListUnionErr(pctxt,
15657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4,
15658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				type, facet);
15659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ok = 0;
15660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facet->next;
15662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (facet != NULL);
15663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ok == 0)
15664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_ST_RESTRICTS_3_3_2_4);
15665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.3.2.5) (same as 1.3.2)
15669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
15670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE (3.3.2.5) This is currently done in
15671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * xmlSchemaDeriveAndValidateFacets()
15672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSRCSimpleType:
15681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1568460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Checks crc-simple-type constraints.
15685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied,
15687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not a positive error code and -1 on internal
15688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
15691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCSimpleType(xmlSchemaParserCtxtPtr ctxt,
15693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaTypePtr type)
15694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * src-simple-type.1 The corresponding simple type definition, if any,
15697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must satisfy the conditions set out in Constraints on Simple Type
1569860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.14.6).
1569960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
15700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_RESTRICTION(type)) {
15701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-simple-type.2 "If the <restriction> alternative is chosen,
15703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* either it must have a base [attribute] or a <simpleType> among its
15704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* [children], but not both."
15705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: This is checked in the parse function of <restriction>.
15706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1570860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*
15709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
15711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* src-simple-type.3 "If the <list> alternative is chosen, either it must have
15712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* an itemType [attribute] or a <simpleType> among its [children],
15713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* but not both."
15714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: This is checked in the parse function of <list>.
15716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1571760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (WXS_IS_UNION(type)) {
1571860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
15719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* src-simple-type.4 is checked in xmlSchemaCheckUnionTypeDefCircular().
15720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
15725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCreateVCtxtOnPCtxt(xmlSchemaParserCtxtPtr ctxt)
15728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   if (ctxt->vctxt == NULL) {
15730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->vctxt = xmlSchemaNewValidCtxt(NULL);
15731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->vctxt == NULL) {
15732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(ctxt, NULL,
15733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
15734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaCreateVCtxtOnPCtxt, "
15735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to create a temp. validation context.\n",
15736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
15737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
15738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Pass user data. */
15740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidErrors(ctxt->vctxt,
15741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->error, ctxt->warning, ctxt->errCtxt);
15742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidStructuredErrors(ctxt->vctxt,
15743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->serror, ctxt->errCtxt);
15744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
15750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
15751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
15752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value,
15753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaValPtr *retVal,
15754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int fireErrors,
15755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int normalize,
15756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isNormalized);
15757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParseCheckCOSValidDefault:
15760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context
15761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the simple type definition
15762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value: the default value
15763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: an optional node (the holder of the value)
15764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint: Element Default Valid (Immediate)
15766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (cos-valid-default)
15767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This will be used by the parser only. For the validator there's
15768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * an other version.
15769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied,
15771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not, a positive error code and -1 on internal
15772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors.
15773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParseCheckCOSValidDefault(xmlSchemaParserCtxtPtr pctxt,
15776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlNodePtr node,
15777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaTypePtr type,
15778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   const xmlChar *value,
15779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaValPtr *val)
15780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
15782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cos-valid-default:
15785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Element Default Valid (Immediate)
15786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * For a string to be a valid default with respect to a type
15787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition the appropriate case among the following must be true:
15788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if WXS_IS_COMPLEX(type) {
15790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Complex type.
15792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
15793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "its {content type} must be a simple type definition
15794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* or mixed."
15795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
1579660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* type}'s particle must be �emptiable� as defined by
1579760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Particle Emptiable (�3.9.6)."
15798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_HAS_SIMPLE_CONTENT(type)) &&
15800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((! WXS_HAS_MIXED_CONTENT(type)) || (! WXS_EMPTIABLE(type)))) {
15801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* NOTE that this covers (2.2.2) as well. */
15802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
15803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_VALID_DEFAULT_2_1,
15804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node,
15805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"For a string to be a valid default, the type definition "
15806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be a simple type or a complex type with mixed content "
15807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"and a particle emptiable", NULL);
15808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMAP_COS_VALID_DEFAULT_2_1);
15809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 If the type definition is a simple type definition, then the string
1581360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be �valid� with respect to that definition as defined by String
1581460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Valid (�3.14.4).
15815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
15817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2.1 If the {content type} is a simple type definition, then the
1581960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * string must be �valid� with respect to that simple type definition
1582060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * as defined by String Valid (�3.14.4).
15821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(type))
15823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
15824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, val, 1, 1, 0);
15825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (WXS_HAS_SIMPLE_CONTENT(type))
15826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt, node,
15827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef, value, val, 1, 1, 0);
15828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
15829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
15830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
15832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaParseCheckCOSValidDefault",
15833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVCheckCVCSimpleType()");
15834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
15837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCTPropsCorrect:
15841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
15843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *.(4.6) Constraints on Complex Type Definition Schema Components
15845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
15846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Complex Type Definition Properties Correct (ct-props-correct)
15847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: (seems) complete
15848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
15850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
15851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCTPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
15854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type)
15855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_SRC_CT_1 is used temporarily.
15858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The values of the properties of a complex type definition must
15860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be as described in the property tableau in The Complex Type Definition
1586160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Schema Component (�3.4.1), modulo the impact of Missing
1586260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
15863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->baseType != NULL) &&
15865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_SIMPLE(type->baseType)) &&
15866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_IS_EXTENSION(type) == 0)) {
15867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
15868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If the {base type definition} is a simple type definition,
15869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the {derivation method} must be extension."
15870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
15871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomErr(ACTXT_CAST pctxt,
15872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_CT_1,
1587360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    NULL, WXS_BASIC_CAST type,
15874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "If the base type is a simple type, the derivation method must be "
15875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "'extension'", NULL, NULL);
15876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMAP_SRC_CT_1);
15877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1587960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (3) "Circular definitions are disallowed, except for the �ur-type
1588060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�. That is, it must be possible to reach the �ur-type
15881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition by repeatedly following the {base type definition}."
15882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
15883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (3) is done in xmlSchemaCheckTypeDefCircular().
15884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that (4) and (5) need the following:
15887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - attribute uses need to be already inherited (apply attr. prohibitions)
15888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - attribute group references need to be expanded already
15889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - simple types need to be typefixed already
1589060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
15891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attrUses &&
15892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((xmlSchemaItemListPtr) type->attrUses)->nbItems > 1))
15893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
15894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr uses = (xmlSchemaItemListPtr) type->attrUses;
15895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUsePtr use, tmp;
15896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, hasId = 0;
15897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = uses->nbItems -1; i >= 0; i--) {
15899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use = uses->items[i];
1590060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1590160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
15902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ct-props-correct
15903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4) "Two distinct attribute declarations in the
15904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute uses} must not have identical {name}s and
15905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace}s."
15906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i > 0) {
15908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = i -1; j >= 0; j--) {
15909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = uses->items[j];
15910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
15911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(tmp)) &&
15912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(use) ==
15913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(tmp)))
15914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
15915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
15916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
15918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
15919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, WXS_BASIC_CAST type,
15920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Duplicate %s",
15921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
15922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
15923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
15924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
15925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate.
15926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
15927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
15928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto exit_failure;
15929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_use;
15930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
15931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
15934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ct-props-correct
15935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (5) "Two distinct attribute declarations in the
15936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute uses} must not have {type definition}s which
15937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are or are derived from ID."
15938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
15939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
15940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsDerivedFromBuiltInType(
15941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
1594260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
15943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (hasId) {
15944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1594560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
15947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
15948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL, WXS_BASIC_CAST type,
15949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "There must not exist more than one attribute "
15950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "declaration of type 'xs:ID' "
15951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(or derived from 'xs:ID'). The %s violates this "
15952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "constraint",
15953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
15954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
15955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
15956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
15957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto exit_failure;
15958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1595960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
15960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasId = 1;
15961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
15962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
15963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_use: {}
15964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
15965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
15966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
15967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
15968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
15969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
15972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAreEqualTypes(xmlSchemaTypePtr typeA,
15973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr typeB)
15974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
15975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
15976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This should implement component-identity
15977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * in the future.
15978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
15979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((typeA == NULL) || (typeB == NULL))
15980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
15981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (typeA == typeB);
15982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
15983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
15984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
15985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSCTDerivedOK:
15986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
15987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the to-be derived complex type definition
15988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base complex type definition
15989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @set: the given set
15990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
15992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Complex) (cos-ct-derived-ok)
15993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: completed
15995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
15996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, or 1
15997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * if not.
15998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSCTDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
16002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr baseType,
16003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int set)
16004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int equal = xmlSchemaAreEqualTypes(type, baseType);
16006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes. */
16007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC "For a complex type definition (call it D, for derived)
16009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to be validly derived from a type definition (call this
16010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * B, for base) given a subset of {extension, restriction}
16011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * all of the following must be true:"
16012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! equal) {
16014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1) "If B and D are not the same type definition, then the
16016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {derivation method} of D must not be in the subset."
16017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (((set & SUBSET_EXTENSION) && (WXS_IS_EXTENSION(type))) ||
16019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((set & SUBSET_RESTRICTION) && (WXS_IS_RESTRICTION(type))))
16020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
16021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "B and D must be the same type definition."
16024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2.2) "B must be D's {base type definition}."
16029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == baseType)
16031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1603360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (2.3.1) "D's {base type definition} must not be the �ur-type
1603460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�."
16035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANYTYPE(type->baseType))
16037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(type->baseType)) {
16040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.3.2.1) "If D's {base type definition} is complex, then it
16042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be validly derived from B given the subset as defined by this
16043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* constraint."
16044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type->baseType,
16046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, set));
16047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.3.2.2) "If D's {base type definition} is simple, then it
16050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be validly derived from B given the subset as defined in Type
1605160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Derivation OK (Simple) (�3.14.6).
16052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type->baseType,
16054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    baseType, set));
16055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSDerivedOK:
16060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the derived simple type definition
16061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @baseType:  the base type definition
16062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Calls:
16064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Type Derivation OK (Simple) AND Type Derivation OK (Complex)
16065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks wheter @type can be validly derived from @baseType.
16067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success, an positive error code otherwise.
16069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSDerivedOK(xmlSchemaAbstractCtxtPtr actxt,
16072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type,
16073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr baseType,
16074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   int set)
16075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(type))
16077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSSTDerivedOK(actxt, type, baseType, set));
16078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
16079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaCheckCOSCTDerivedOK(actxt, type, baseType, set));
16080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSCTExtends:
16084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.6) Constraints on Complex Type Definition Schema Components
16088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Extension) (cos-ct-extends)
16090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing:
16093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (1.5)
16094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (1.4.3.2.2.2) "Particle Valid (Extension)"
16095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSCTExtends(xmlSchemaParserCtxtPtr ctxt,
16101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaTypePtr type)
16102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base = type->baseType;
16104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_COS_CT_EXTENDS_1_1 is used
16106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * temporarily only.
16107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "If the {base type definition} is a complex type definition,
16110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * then all of the following must be true:"
16111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1611260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (WXS_IS_COMPLEX(base)) {
16113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.1) "The {final} of the {base type definition} must not
16115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* contain extension."
16116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'final' of the base type definition "
16122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"contains 'extension'", NULL);
16123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1612560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* ATTENTION: The constrains (1.2) and (1.3) are not applied,
16128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* since they are automatically satisfied through the
16129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* inheriting mechanism.
16130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that even if redefining components, the inheriting mechanism
16131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* is used.
16132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
16134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.2) "Its {attribute uses} must be a subset of the {attribute
16136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* uses}
16137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the complex type definition itself, that is, for every attribute
16138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* use in the {attribute uses} of the {base type definition}, there
16139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be an attribute use in the {attribute uses} of the complex
16140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type definition itself whose {attribute declaration} has the same
16141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {name}, {target namespace} and {type definition} as its attribute
16142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* declaration"
16143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->attrUses != NULL) {
16145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, j, found;
16146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAttributeUsePtr use, buse;
16147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < (WXS_LIST_CAST base->attrUses)->nbItems; i ++) {
16149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		buse = (WXS_LIST_CAST base->attrUses)->items[i];
16150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 0;
16151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attrUses != NULL) {
16152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    use = (WXS_LIST_CAST type->attrUses)->items[j];
16153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < (WXS_LIST_CAST type->attrUses)->nbItems; j ++)
16154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
16155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((WXS_ATTRUSE_DECL_NAME(use) ==
16156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_NAME(buse)) &&
16157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_DECL_TNS(use) ==
16158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_DECL_TNS(buse)) &&
16159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (WXS_ATTRUSE_TYPEDEF(use) ==
16160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_ATTRUSE_TYPEDEF(buse))
16161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			{
16162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    found = 1;
16163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
16164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
16165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
16166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! found) {
16168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
1616960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST ctxt,
16171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_CT_EXTENDS_1_2,
16172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, WXS_BASIC_CAST type,
1617360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
16174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* TODO: The report does not indicate that also the
16175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* type needs to be the same.
16176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
16177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"This type is missing a matching correspondent "
16178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"for its {base type}'s %s in its {attribute uses}",
16179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentDesignation(&str,
16180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    buse->children),
16181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
16182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
16183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.3) "If it has an {attribute wildcard}, the complex type
16188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition must also have one, and the base type definition's
16189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {attribute  wildcard}'s {namespace constraint} must be a subset
16190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the complex  type definition's {attribute wildcard}'s {namespace
1619160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* constraint}, as defined by Wildcard Subset (�3.10.6)."
16192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1619360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* MAYBE TODO: Enable if ever needed. But this will be needed only
16196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* if created the type via a schema construction API.
16197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->attributeWildcard != NULL) {
16199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->attributeWilcard == NULL) {
16200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
1620160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
16203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
16204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, type,
16205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The base %s has an attribute wildcard, "
16206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "but this type is missing an attribute wildcard",
16207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&str, base));
16208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (xmlSchemaCheckCOSNSSubset(
16211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		base->attributeWildcard, type->attributeWildcard))
16212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
16213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
1621460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
16215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
16216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_3,
16217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, type,
16218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The attribute wildcard is not a valid "
16219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "superset of the one in the base %s",
16220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&str, base));
16221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
16225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1.4) "One of the following must be true:"
16227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->contentTypeDef != NULL) &&
16229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->contentTypeDef == base->contentTypeDef)) {
16230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.1) "The {content type} of the {base type definition}
16232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * and the {content type} of the complex type definition itself
16233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * must be the same simple type definition"
16234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((type->contentType == XML_SCHEMA_CONTENT_EMPTY) &&
16237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_EMPTY) ) {
16238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.2) "The {content type} of both the {base type
16240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} and the complex type definition itself must
16241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be empty."
16242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.3) "All of the following must be true:"
16247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->subtypes == NULL) {
16249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC 1.4.3.1 The {content type} of the complex type
16251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition itself must specify a particle.
16252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The content type must specify a particle", NULL);
16257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1.4.3.2) "One of the following must be true:"
16261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.4.3.2.1) "The {content type} of the {base type
16265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition} must be empty.
16266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* PASS
16267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.4.3.2.2) "All of the following must be true:"
16271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((type->contentType != base->contentType) ||
16273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((type->contentType != XML_SCHEMA_CONTENT_MIXED) &&
16274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (type->contentType != XML_SCHEMA_CONTENT_ELEMENTS))) {
16275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC (1.4.3.2.2.1) "Both {content type}s must be mixed
16277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * or both must be element-only."
16278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
16279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
16280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
16282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The content type of both, the type and its base "
16283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"type, must either 'mixed' or 'element-only'", NULL);
16284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO SPEC (1.4.3.2.2.2) "The particle of the
1628860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* complex type definition must be a �valid extension�
16289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of the {base type definition}'s particle, as defined
1629060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* in Particle Valid (Extension) (�3.9.6)."
16291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
16292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that we won't check "Particle Valid (Extension)",
16293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* since it is ensured by the derivation process in
16294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* xmlSchemaTypeFixup(). We need to implement this when heading
16295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for a construction API
16296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: !! This is needed to be checked if redefining a type !!
16297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * URGENT TODO (1.5)
16301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If the {base type definition} is a simple type definition,
16306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then all of the following must be true:"
16307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->contentTypeDef != base) {
16309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.1) "The {content type} must be the same simple type
16311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition."
16312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type must be the simple base type", NULL);
16317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->flags & XML_SCHEMAS_TYPE_FINAL_EXTENSION) {
16320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.2) "The {final} of the {base type definition} must not
16322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain extension"
16323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that this is the same as (1.1).
16324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_COS_CT_EXTENDS_1_1,
16327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'final' of the base type definition "
16329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"contains 'extension'", NULL);
16330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_COS_CT_EXTENDS_1_1);
16331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckDerivationOKRestriction:
16338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.6) Constraints on Complex Type Definition Schema Components
16342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Derivation Valid (Restriction, Complex) (derivation-ok-restriction)
16344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing:
16347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     (5.4.2) ???
16348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ATTENTION:
16350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In XML Schema 1.1 this will be:
16351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation Rule: Checking complex type subsumption
16352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckDerivationOKRestriction(xmlSchemaParserCtxtPtr ctxt,
16358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				      xmlSchemaTypePtr type)
16359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base;
16361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Correct the error code; XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1 is used
16364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * temporarily only.
16365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    base = type->baseType;
16367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_COMPLEX(base)) {
1636860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCustomErr(ACTXT_CAST ctxt,
16369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->node, WXS_BASIC_CAST type,
16371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The base type must be a complex type", NULL, NULL);
16372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
16373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (base->flags & XML_SCHEMAS_TYPE_FINAL_RESTRICTION) {
16375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (1) "The {base type definition} must be a complex type
16377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition whose {final} does not contain restriction."
16378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1637960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCustomErr(ACTXT_CAST ctxt,
16380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->node, WXS_BASIC_CAST type,
16382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The 'final' of the base type definition "
16383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "contains 'restriction'", NULL, NULL);
16384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
16385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2), (3) and (4)
16388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Those are handled in a separate function, since the
16389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * same constraints are needed for redefinition of
16390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * attribute groups as well.
16391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckDerivationOKRestriction2to4(ctxt,
16393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ACTION_DERIVE,
16394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST type, WXS_BASIC_CAST base,
16395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->attrUses, base->attrUses,
16396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->attributeWildcard,
16397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	base->attributeWildcard) == -1)
16398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
16399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
16400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (5) "One of the following must be true:"
16403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (base->builtInType == XML_SCHEMAS_ANYTYPE) {
16405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.1) "The {base type definition} must be the
1640760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �ur-type definition�."
16408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PASS
16409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((type->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.2.1) "The {content type} of the complex type definition
16414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a simple type definition"
16415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
16416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.2.2) "One of the following must be true:"
16417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_BASIC))
16420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
16421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int err;
16422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.2.2.1) "The {content type} of the {base type
16424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must be a simple type definition from which
16425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {content type} is validly derived given the empty
1642660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * set as defined in Type Derivation OK (Simple) (�3.14.6)."
16427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
16428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * ATTENTION TODO: This seems not needed if the type implicitely
16429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the base type.
1643060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    *
16431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = xmlSchemaCheckCOSSTDerivedOK(ACTXT_CAST ctxt,
16433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef, base->contentTypeDef, 0);
16434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (err != 0) {
16435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL;
16436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (err == -1)
16438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
16439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST ctxt,
16440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, WXS_BASIC_CAST type,
16442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The {content type} %s is not validly derived from the "
16443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type's {content type} %s",
16444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strA,
16445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->contentTypeDef),
16446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentDesignation(&strB,
16447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			base->contentTypeDef));
16448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA);
16449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB);
16450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ctxt->err);
16451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaIsParticleEmptiable(
16454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaParticlePtr) base->subtypes))) {
16455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.2.2.2) "The {base type definition} must be mixed
1645760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * and have a particle which is �emptiable� as defined in
1645860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Particle Emptiable (�3.9.6)."
16459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type of the base type must be either "
16466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"a simple type or 'mixed' and an emptiable particle", NULL);
16467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.3.1) "The {content type} of the complex type itself must
16472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* be empty"
16473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (base->contentType == XML_SCHEMA_CONTENT_EMPTY) {
16475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.3.2.1) "The {content type} of the {base type
16477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must also be empty."
16478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (((base->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (base->contentType == XML_SCHEMA_CONTENT_MIXED)) &&
16482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIsParticleEmptiable(
16483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaParticlePtr) base->subtypes)) {
16484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.3.2.2) "The {content type} of the {base type
16486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition} must be elementOnly or mixed and have a particle
1648760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * which is �emptiable� as defined in Particle Emptiable (�3.9.6)."
16488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PASS
16489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The content type of the base type must be either "
16495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"empty or 'mixed' (or 'elements-only') and an emptiable "
16496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"particle", NULL);
16497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((type->contentType == XML_SCHEMA_CONTENT_ELEMENTS) ||
16500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_HAS_MIXED_CONTENT(type)) {
16501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.4.1.1) "The {content type} of the complex type definition
16503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* itself must be element-only"
1650460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
16505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_HAS_MIXED_CONTENT(type) && (! WXS_HAS_MIXED_CONTENT(base))) {
16506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
16507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (5.4.1.2) "The {content type} of the complex type
16508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition itself and of the {base type definition} must be
16509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * mixed"
16510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
16511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
16514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"If the content type is 'mixed', then the content type of the "
16515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"base type must also be 'mixed'", NULL);
16516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ctxt->err);
16517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (5.4.2) "The particle of the complex type definition itself
1652060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* must be a �valid restriction� of the particle of the {content
16521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* type} of the {base type definition} as defined in Particle Valid
1652260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (Restriction) (�3.9.6).
16523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
16524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT TODO: (5.4.2)
16525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
16528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_DERIVATION_OK_RESTRICTION_1,
16529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST type, NULL,
16530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The type is not a valid restriction of its base type", NULL);
16531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->err);
16532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCTComponent:
16538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.6) Constraints on Complex Type Definition Schema Components
16542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCTComponent(xmlSchemaParserCtxtPtr ctxt,
16548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
16549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
16551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Complex Type Definition Properties Correct
16553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckCTPropsCorrect(ctxt, type);
16555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
16556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
16557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_EXTENSION(type))
16558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaCheckCOSCTExtends(ctxt, type);
16559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
16560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaCheckDerivationOKRestriction(ctxt, type);
16561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
16562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckSRCCT:
16566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.4.3) Constraints on XML Representations of Complex Type Definitions:
16570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Representation Constraint:
16571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Complex Type Definition Representation OK (src-ct)
16572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCCT(xmlSchemaParserCtxtPtr ctxt,
16578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaTypePtr type)
16579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base;
16581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
16582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Adjust the error codes here, as I used
16585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMAP_SRC_CT_1 only yet.
16586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    base = type->baseType;
16588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_HAS_SIMPLE_CONTENT(type)) {
16589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1 If the <complexContent> alternative is chosen, the type definition
1659160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �resolved� to by the �actual value� of the base [attribute]
16592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must be a complex type definition;
16593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_IS_COMPLEX(base)) {
16595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
16596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
16597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_CT_1,
16598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, type->node,
16599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"If using <complexContent>, the base type is expected to be "
16600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"a complex type. The base type '%s' is a simple type",
16601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, base->targetNamespace,
16602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		base->name));
16603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
16604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMAP_SRC_CT_1);
16605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
16607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
16608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC
16609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2 If the <simpleContent> alternative is chosen, all of the
16610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* following must be true:
1661160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 2.1 The type definition �resolved� to by the �actual value� of the
16612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* base [attribute] must be one of the following:
16613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
16614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(base)) {
16615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_EXTENSION(type) == 0) {
16616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
16617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.3 only if the <extension> alternative is also
16619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chosen, a simple type definition.
16620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: Change error code to ..._SRC_CT_2_1_3. */
16622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If using <simpleContent> and <restriction>, the base "
16626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type must be a complex type. The base type '%s' is "
16627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "a simple type",
16628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			base->name));
16630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
16631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (XML_SCHEMAP_SRC_CT_1);
16632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
16634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Base type is a complex type. */
16635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((base->contentType == XML_SCHEMA_CONTENT_SIMPLE) ||
16636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(base->contentType == XML_SCHEMA_CONTENT_BASIC)) {
16637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.1 a complex type definition whose {content type} is a
16639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* simple type definition;
16640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* PASS
16641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (base->contentTypeDef == NULL) {
16643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt, XML_SCHEMAP_INTERNAL,
16644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
16645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Internal error: xmlSchemaCheckSRCCT, "
16646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'%s', base type has no content type",
16647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->name);
16648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
16649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if ((base->contentType == XML_SCHEMA_CONTENT_MIXED) &&
16651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_IS_RESTRICTION(type))) {
16652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
16654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* 2.1.2 only if the <restriction> alternative is also
16655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* chosen, a complex type definition whose {content type}
16656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is mixed and a particle emptiable.
16657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
16658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaIsParticleEmptiable(
16659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaParticlePtr) base->subtypes)) {
16660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_SRC_CT_1;
1666160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else
16662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Attention: at this point the <simpleType> child is in
16664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * ->contentTypeDef (put there during parsing).
1666560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
16666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (type->contentTypeDef == NULL) {
16667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
16668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
16669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * 2.2 If clause 2.1.2 above is satisfied, then there
16670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * must be a <simpleType> among the [children] of
16671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <restriction>.
16672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
16673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: Change error code to ..._SRC_CT_2_2. */
16674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaPCustomErr(ctxt,
16675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_SRC_CT_1,
16676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST type, NULL,
16677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"A <simpleType> is expected among the children "
16678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"of <restriction>, if <simpleContent> is used and "
16679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"the base type '%s' is a complex type",
16680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str, base->targetNamespace,
16681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			base->name));
16682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
16683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (XML_SCHEMAP_SRC_CT_1);
16684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
16685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_SRC_CT_1;
16687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret > 0) {
16690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
16691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_RESTRICTION(type)) {
16692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If <simpleContent> and <restriction> is used, the "
16696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type must be a simple type or a complex type with "
16697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "mixed content and particle emptiable. The base type "
16698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "'%s' is none of those",
16699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base->name));
16701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
16702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(ctxt,
16703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_SRC_CT_1,
16704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
16705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "If <simpleContent> and <extension> is used, the "
16706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "base type must be a simple type. The base type '%s' "
16707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "is a complex type",
16708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, base->targetNamespace,
16709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base->name));
16710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
16711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
16712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
16713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3) "The corresponding complex type definition component must
16716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * satisfy the conditions set out in Constraints on Complex Type
1671760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.4.6);"
16718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (3) will be done in xmlSchemaTypeFixup().
16719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (4) If clause 2.2.1 or clause 2.2.2 in the correspondence specification
16722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * above for {attribute wildcard} is satisfied, the intensional
16723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * intersection must be expressible, as defined in Attribute Wildcard
1672460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Intersection (�3.10.6).
16725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (4) is done in xmlSchemaFixupTypeAttributeUses().
16726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
16728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_PARTICLE_RESTRICTION
16731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckParticleRangeOK:
16733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Occurrence Range OK (range-ok)
16739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckParticleRangeOK(int rmin, int rmax,
16747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int bmin, int bmax)
16748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (rmin < bmin)
16750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bmax != UNBOUNDED) &&
16752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(rmax > bmax))
16753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNameAndTypeOK:
16759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base element declaration particle
16762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Restriction OK (Elt:Elt -- NameAndTypeOK)
16766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NameAndTypeOK)
16767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
16769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   MISSING (3.2.3)
16770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   CLARIFY: (3.2.2)
16771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNameAndTypeOK(xmlSchemaParserCtxtPtr ctxt,
16777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr r,
16778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaParticlePtr b)
16779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemR, elemB;
16781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NameAndTypeOK). */
16783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemR = (xmlSchemaElementPtr) r->children;
16784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemB = (xmlSchemaElementPtr) b->children;
16785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The declarations' {name}s and {target namespace}s are
16787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the same."
16788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemR != elemB) &&
16790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((! xmlStrEqual(elemR->name, elemB->name)) ||
16791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! xmlStrEqual(elemR->targetNamespace, elemB->targetNamespace))))
16792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's occurrence range is a valid restriction of B's
1679560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
16799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.1) "Both B's declaration's {scope} and R's declaration's
16802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {scope} are global."
16803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemR == elemB)
16805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
16806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.1) "Either B's {nillable} is true or R's {nillable} is false."
16808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((elemB->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) &&
16810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemR->flags & XML_SCHEMAS_ELEM_NILLABLE))
16811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.2) "either B's declaration's {value constraint} is absent,
16814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * or is not fixed, or R's declaration's {value constraint} is fixed
16815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * with the same value."
16816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemB->value != NULL) && (elemB->flags & XML_SCHEMAS_ELEM_FIXED) &&
16818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemR->value == NULL) ||
16819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_FIXED) == 0) ||
16820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 /* TODO: Equality of the initial value or normalized or canonical? */
16821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (! xmlStrEqual(elemR->value, elemB->value))))
16822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: SPEC (3.2.3) "R's declaration's {identity-constraint
16825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definitions} is a subset of B's declaration's {identity-constraint
16826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definitions}, if any."
16827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemB->idcs != NULL) {
16829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO */
16830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.4) "R's declaration's {disallowed substitutions} is a
16833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * superset of B's declaration's {disallowed substitutions}."
16834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) &&
16836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) == 0)) ||
16837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) &&
16838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) == 0)) ||
16839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((elemB->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) &&
16840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 ((elemR->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION) == 0)))
16841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 return (1);
16842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (3.2.5) "R's {type definition} is validly derived given
16844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {extension, list, union} from B's {type definition}"
16845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
16846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * BADSPEC TODO: What's the point of adding "list" and "union" to the
16847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * set, if the corresponding constraints handle "restriction" and
16848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "extension" only?
16849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
16850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
16852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int set = 0;
16853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_EXTENSION;
16855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_LIST;
16856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	set |= SUBSET_UNION;
16857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST ctxt, elemR->subtypes,
16858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    elemB->subtypes, set) != 0)
16859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
16860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSCompat:
16866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
16869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Elt:Any -- NSCompat)
16873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSCompat)
16874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSCompat(xmlSchemaParserCtxtPtr ctxt,
16882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr r,
16883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaParticlePtr b)
16884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:Error codes (rcase-NSCompat). */
16886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1688760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For an element declaration particle to be a �valid restriction�
16888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a wildcard particle all of the following must be true:"
16889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
1689060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (1) "The element declaration's {target namespace} is �valid�
16891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * with respect to the wildcard's {namespace constraint} as defined by
1689260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Wildcard allows Namespace Name (�3.10.4)."
16893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckCVCWildcardNamespace((xmlSchemaWildcardPtr) b->children,
16895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((xmlSchemaElementPtr) r->children)->targetNamespace) != 0)
16896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's occurrence range is a valid restriction of B's
1689960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
16903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseRecurseAsIfGroup:
16910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting element declaration particle
16912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base model group particle
16913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)
16917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-RecurseAsIfGroup)
16918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO
16920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseRecurseAsIfGroup(xmlSchemaParserCtxtPtr ctxt,
16926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr r,
16927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr b)
16928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-RecurseAsIfGroup). */
16930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
16931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSSubset:
16936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the restricting wildcard particle
16938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
16939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (Any:Any -- NSSubset)
16943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSSubset)
16944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: complete
16946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
16950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
16951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSSubset(xmlSchemaParserCtxtPtr ctxt,
16952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr r,
16953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr b,
16954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int isAnyTypeBase)
16955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
16956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NSSubset). */
16957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "R's occurrence range is a valid restriction of B's
1695960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
16960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
16962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs))
16963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
16965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "R's {namespace constraint} must be an intensional subset
1696660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * of B's {namespace constraint} as defined by Wildcard Subset (�3.10.6)."
16967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckCOSNSSubset((xmlSchemaWildcardPtr) r->children,
16969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaWildcardPtr) b->children))
16970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
16971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1697260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (3) "Unless B is the content model wildcard of the �ur-type
1697360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition�, R's {process contents} must be identical to or stronger
16974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * than B's {process contents}, where strict is stronger than lax is
16975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * stronger than skip."
16976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
16977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! isAnyTypeBase) {
16978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ( ((xmlSchemaWildcardPtr) r->children)->processContents <
16979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((xmlSchemaWildcardPtr) b->children)->processContents)
16980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
16981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
16982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
16984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
16985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
16987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCOSParticleRestrict:
16988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
16989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the complex type definition
16990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
16992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
16993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Valid (Restriction) (cos-particle-restrict)
16994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO
16996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
16997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
16998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
16999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSParticleRestrict(xmlSchemaParserCtxtPtr ctxt,
17002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParticlePtr r,
17003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParticlePtr b)
17004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
17006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*part = WXS_TYPE_PARTICLE(type);
17008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    basePart = WXS_TYPE_PARTICLE(base);
17009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
17012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "They are the same particle."
17015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (r == b)
17017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1702360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#if 0
17024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
17025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseNSRecurseCheckCardinality:
17026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
17027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the model group particle
17028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base wildcard particle
17029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
17031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
17032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (All/Choice/Sequence:Any --
17033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                         NSRecurseCheckCardinality)
17034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-NSRecurseCheckCardinality)
17035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS: TODO: subst-groups
17037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
17039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
17040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseNSRecurseCheckCardinality(xmlSchemaParserCtxtPtr ctxt,
17043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaParticlePtr r,
17044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaParticlePtr b)
17045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr part;
17047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-NSRecurseCheckCardinality). */
17048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((r->children == NULL) || (r->children->children == NULL))
17049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
17050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1705160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For a group particle to be a �valid restriction� of a
17052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * wildcard particle..."
17053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
1705460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (1) "Every member of the {particles} of the group is a �valid
1705560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of the wildcard as defined by
1705660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Particle Valid (Restriction) (�3.9.6)."
17057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    part = (xmlSchemaParticlePtr) r->children->children;
17059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
17060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCOSParticleRestrict(ctxt, part, b))
17061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
17062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	part = (xmlSchemaParticlePtr) part->next;
17063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (part != NULL);
17064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2) "The effective total range of the group [...] is a
17066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * valid restriction of B's occurrence range as defined by
1706760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Occurrence Range OK (�3.9.6)."
17068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(
17070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetParticleTotalRangeMin(r),
17071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetParticleTotalRangeMax(r),
17072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs) != 0)
17073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
17074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1707660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
17077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
17079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckRCaseRecurse:
17080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
17081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @r: the <all> or <sequence> model group particle
17082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @b: the base <all> or <sequence> model group particle
17083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (3.9.6) Constraints on Particle Schema Components
17085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
17086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Particle Derivation OK (All:All,Sequence:Sequence --
17087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           Recurse)
17088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (rcase-Recurse)
17089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:  ?
17091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: subst-groups
17092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
17093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the constraints are satisfied, a positive
17094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * error code if not and -1 if an internal error occured.
17095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
17096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckRCaseRecurse(xmlSchemaParserCtxtPtr ctxt,
17098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParticlePtr r,
17099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaParticlePtr b)
17100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaParticlePtr part; */
17102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Error codes (rcase-Recurse). */
17103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((r->children == NULL) || (b->children == NULL) ||
17104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(r->children->type != b->children->type))
17105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
17106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1710760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC "For an all or sequence group particle to be a �valid
1710860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of another group particle with the same {compositor}..."
17109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "R's occurrence range is a valid restriction of B's
1711160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * occurrence range as defined by Occurrence Range OK (�3.9.6)."
17112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckParticleRangeOK(r->minOccurs, r->maxOccurs,
17114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    b->minOccurs, b->maxOccurs))
17115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
17116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
17122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_MUTUAL_ERR(fac1, fac2) \
17124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErrExt(pctxt,      \
17125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac1, fac1->node, \
17127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"It is an error for both '%s' and '%s' to be specified on the "\
17128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"same type definition", \
17129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFacetTypeToString(fac1->type), \
17130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	BAD_CAST xmlSchemaFacetTypeToString(fac2->type), NULL);
17131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_ERR(fac1, msg) \
17133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt,      \
17134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac1, fac1->node, \
17136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg, NULL);
17137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FACET_RESTR_FIXED_ERR(fac) \
17139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt, \
17140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE, \
17141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST fac, fac->node, \
17142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"The base type's facet is 'fixed', thus the value must not " \
17143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"differ", NULL);
17144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDeriveFacetErr(xmlSchemaParserCtxtPtr pctxt,
17147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetPtr facet1,
17148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetPtr facet2,
17149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int lessGreater,
17150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int orEqual,
17151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ofBase)
17152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg = NULL;
17154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrdup(BAD_CAST "'");
17156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet1->type));
17157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST "' has to be");
17158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lessGreater == 0)
17159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " equal to");
17160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lessGreater == 1)
17161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " greater than");
17162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
17163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " less than");
17164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (orEqual)
17166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST " or equal to");
17167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, BAD_CAST " '");
17168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlStrcat(msg, xmlSchemaFacetTypeToString(facet2->type));
17169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ofBase)
17170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "' of the base type");
17171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
17172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	msg = xmlStrcat(msg, BAD_CAST "'");
17173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPCustomErr(pctxt,
17175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMAP_INVALID_FACET_VALUE,
17176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_BASIC_CAST facet1, NULL,
17177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(const char *) msg, NULL);
17178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg != NULL)
17180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(msg);
17181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
17184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaDeriveAndValidateFacets:
17185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
17186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Schema Component Constraint: Simple Type Restriction (Facets)
17187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* (st-restrict-facets)
17188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
17189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDeriveAndValidateFacets(xmlSchemaParserCtxtPtr pctxt,
17191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
17192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr base = type->baseType;
17194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetLinkPtr link, cur, last = NULL;
17195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet, bfacet,
17196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flength = NULL, ftotdig = NULL, ffracdig = NULL,
17197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fmaxlen = NULL, fminlen = NULL, /* facets of the current type */
17198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fmininc = NULL, fmaxinc = NULL,
17199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fminexc = NULL, fmaxexc = NULL,
17200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bflength = NULL, bftotdig = NULL, bffracdig = NULL,
17201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfmaxlen = NULL, bfminlen = NULL, /* facets of the base type */
17202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfmininc = NULL, bfmaxinc = NULL,
17203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfminexc = NULL, bfmaxexc = NULL;
17204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res; /* err = 0, fixedErr; */
17205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 1:
1720860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * "The {variety} of R is the same as that of B."
17209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 2:
17212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "If {variety} is atomic, the {primitive type definition}
17213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of R is the same as that of B."
17214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: we leave 1 & 2 out for now, since this will be
17216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * satisfied by the derivation process.
17217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * CONSTRUCTION TODO: Maybe needed if using a construction API.
17218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC st-restrict-facets 3:
17221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The {facets} of R are the union of S and the {facets}
17222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of B, eliminating duplicates. To eliminate duplicates,
17223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * when a facet of the same kind occurs in both S and the
17224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {facets} of B, the one in the {facets} of B is not
17225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * included, with the exception of enumeration and pattern
17226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * facets, for which multiple occurrences with distinct values
17227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * are allowed."
17228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->facetSet == NULL) && (base->facetSet == NULL))
17231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = type->facetSet;
17234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (last != NULL)
17235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (last->next != NULL)
17236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = last->next;
17237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = type->facetSet; cur != NULL; cur = cur->next) {
17239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = cur->facet;
17240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facet->type) {
17241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
17242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		flength = facet; break;
17243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
17244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fminlen = facet; break;
17245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MININCLUSIVE:
17246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmininc = facet; break;
17247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
17248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fminexc = facet; break;
17249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
17250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxlen = facet; break;
17251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
17252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxinc = facet; break;
17253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		fmaxexc = facet; break;
17255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_TOTALDIGITS:
17256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ftotdig = facet; break;
17257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
17258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ffracdig = facet; break;
17259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
17260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
17264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = cur->facet;
17265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facet->type) {
17266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
17267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bflength = facet; break;
17268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
17269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfminlen = facet; break;
17270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MININCLUSIVE:
17271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmininc = facet; break;
17272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINEXCLUSIVE:
17273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfminexc = facet; break;
17274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
17275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxlen = facet; break;
17276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXINCLUSIVE:
17277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxinc = facet; break;
17278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXEXCLUSIVE:
17279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bfmaxexc = facet; break;
17280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_TOTALDIGITS:
17281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bftotdig = facet; break;
17282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_FRACTIONDIGITS:
17283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bffracdig = facet; break;
17284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
17285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * length and minLength or maxLength (2.2) + (3.2)
17290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength && (fminlen || fmaxlen)) {
17292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_ERR(flength, "It is an error for both 'length' and "
17293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "either of 'minLength' or 'maxLength' to be specified on "
17294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "the same type definition")
17295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Mutual exclusions in the same derivation step.
17298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((fmaxinc) && (fmaxexc)) {
17300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxInclusive and maxExclusive"
17302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_MUTUAL_ERR(fmaxinc, fmaxexc)
17304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((fmininc) && (fminexc)) {
17306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "minInclusive and minExclusive"
17308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FACET_RESTR_MUTUAL_ERR(fmininc, fminexc)
17310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength && bflength) {
17313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "length valid restriction"
17315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The values have to be equal.
17316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(flength->val, bflength->val);
17318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0)
17321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, flength, bflength, 0, 0, 1);
17322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bflength->fixed)) {
17323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(flength)
17324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fminlen && bfminlen) {
17328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "minLength valid restriction"
17330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* minLength >= BASE minLength
17331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(fminlen->val, bfminlen->val);
17333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1)
17336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, fminlen, bfminlen, 1, 1, 1);
17337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bfminlen->fixed)) {
17338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(fminlen)
17339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxlen && bfmaxlen) {
17342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxLength valid restriction"
17344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* maxLength <= BASE minLength
17345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(fmaxlen->val, bfmaxlen->val);
17347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, fmaxlen, bfmaxlen, -1, 1, 1);
17351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bfmaxlen->fixed)) {
17352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(fmaxlen)
17353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SCC "length and minLength or maxLength"
17357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! flength)
17359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flength = bflength;
17360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flength) {
17361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! fminlen)
17362df143a5041f03a22808b59c76698770b74692815Selim Gurun	    fminlen = bfminlen;
17363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fminlen) {
17364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* (1.1) length >= minLength */
17365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(flength->val, fminlen->val);
17366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1)
17369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, flength, fminlen, 1, 1, 0);
17370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! fmaxlen)
17372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fmaxlen = bfmaxlen;
17373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxlen) {
17374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* (2.1) length <= maxLength */
17375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(flength->val, fmaxlen->val);
17376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1)
17379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, flength, fmaxlen, -1, 1, 0);
17380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxinc) {
17383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxInclusive"
17385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmininc) {
17387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* SCC "maxInclusive >= minInclusive" */
17388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, fmininc->val);
17389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, fmininc, 1, 1, 0);
17393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC "maxInclusive valid restriction"
17397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive <= BASE maxInclusive */
17400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxinc->val);
17401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1)
17404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxinc, -1, 1, 1);
17405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmaxinc->fixed)) {
17406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmaxinc)
17407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive < BASE maxExclusive */
17411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmaxexc->val);
17412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmaxexc, -1, 0, 1);
17416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive >= BASE minInclusive */
17420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfmininc->val);
17421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfmininc, 1, 1, 1);
17425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxInclusive > BASE minExclusive */
17429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxinc->val, bfminexc->val);
17430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxinc, bfminexc, 1, 0, 1);
17434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmaxexc) {
17438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxExclusive >= minExclusive"
17440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fminexc) {
17442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, fminexc->val);
17443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, fminexc, 1, 1, 0);
17447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "maxExclusive valid restriction"
17451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive <= BASE maxExclusive */
17454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxexc->val);
17455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxexc, -1, 1, 1);
17459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmaxexc->fixed)) {
17461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmaxexc)
17462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive <= BASE maxInclusive */
17466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmaxinc->val);
17467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmaxinc, -1, 1, 1);
17471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive > BASE minInclusive */
17475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfmininc->val);
17476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfmininc, 1, 0, 1);
17480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* maxExclusive > BASE minExclusive */
17484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmaxexc->val, bfminexc->val);
17485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1) {
17488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmaxexc, bfminexc, 1, 0, 1);
17489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fminexc) {
17493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive < maxInclusive"
17495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxinc) {
17497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, fmaxinc->val);
17498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, fmaxinc, -1, 0, 0);
17502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive valid restriction"
17506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive >= BASE minExclusive */
17509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfminexc->val);
17510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfminexc, 1, 1, 1);
17514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfminexc->fixed)) {
17516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fminexc)
17517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive <= BASE maxInclusive */
17521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmaxinc->val);
17522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxinc, -1, 1, 1);
17526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive >= BASE minInclusive */
17530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmininc->val);
17531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmininc, 1, 1, 1);
17535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minExclusive < BASE maxExclusive */
17539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fminexc->val, bfmaxexc->val);
17540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fminexc, bfmaxexc, -1, 0, 1);
17544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (fmininc) {
17548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minInclusive < maxExclusive"
17550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fmaxexc) {
17552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, fmaxexc->val);
17553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1) {
17556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, fmaxexc, -1, 0, 0);
17557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "minExclusive valid restriction"
17561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmininc) {
17563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive >= BASE minInclusive */
17564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmininc->val);
17565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
17568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmininc, 1, 1, 1);
17569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((res != 0) && (bfmininc->fixed)) {
17571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FACET_RESTR_FIXED_ERR(fmininc)
17572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxinc) {
17575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive <= BASE maxInclusive */
17576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmaxinc->val);
17577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == 1) {
17580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxinc, -1, 1, 1);
17581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfminexc) {
17584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive > BASE minExclusive */
17585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfminexc->val);
17586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != 1)
17589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfminexc, 1, 0, 1);
17590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bfmaxexc) {
17592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* minInclusive < BASE maxExclusive */
17593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCompareValues(fmininc->val, bfmaxexc->val);
17594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -2)
17595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
17596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res != -1)
17597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaDeriveFacetErr(pctxt, fmininc, bfmaxexc, -1, 0, 1);
17598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ftotdig && bftotdig) {
17601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC " totalDigits valid restriction"
17603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* totalDigits <= BASE totalDigits
17604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ftotdig->val, bftotdig->val);
17606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ftotdig, bftotdig,
17610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1, 1, 1);
17611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bftotdig->fixed)) {
17612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(ftotdig)
17613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ffracdig && bffracdig) {
17616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SCC  "fractionDigits valid restriction"
17618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* fractionDigits <= BASE fractionDigits
17619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ffracdig->val, bffracdig->val);
17621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, bffracdig,
17625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    -1, 1, 1);
17626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((res != 0) && (bffracdig->fixed)) {
17627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FACET_RESTR_FIXED_ERR(ffracdig)
17628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SCC "fractionDigits less than or equal to totalDigits"
17632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! ftotdig)
17634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ftotdig = bftotdig;
17635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! ffracdig)
17636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ffracdig = bffracdig;
17637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ftotdig && ffracdig) {
17638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaCompareValues(ffracdig->val, ftotdig->val);
17639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -2)
17640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
17641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 1)
17642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaDeriveFacetErr(pctxt, ffracdig, ftotdig,
17643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, 1, 0);
17644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *Enumerations* won' be added here, since only the first set
17647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of enumerations in the ancestor-or-self axis is used
17648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * for validation, plus we need to use the base type of those
17649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * enumerations for whitespace.
17650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *Patterns*: won't be add here, since they are ORed at
17652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * type level and ANDed at ancestor level. This will
17653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * happed during validation by walking the base axis
17654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of the type.
17655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (cur = base->facetSet; cur != NULL; cur = cur->next) {
17657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bfacet = cur->facet;
17658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Special handling of enumerations and patterns.
17660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: hmm, they should not appear in the set, so remove this.
17661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bfacet->type == XML_SCHEMA_FACET_PATTERN) ||
17663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (bfacet->type == XML_SCHEMA_FACET_ENUMERATION))
17664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
17665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Search for a duplicate facet in the current type.
17667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = type->facetSet;
17669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* err = 0; */
17670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* fixedErr = 0; */
17671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (link != NULL) {
17672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = link->facet;
17673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == bfacet->type) {
17674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (facet->type) {
17675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    case XML_SCHEMA_FACET_WHITESPACE:
17676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
17677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* The whitespace must be stronger.
17678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
17679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (facet->whitespace < bfacet->whitespace) {
1768060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    FACET_RESTR_ERR(facet,
17681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The 'whitespace' value has to be equal to "
17682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"or stronger than the 'whitespace' value of "
17683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"the base type")
17684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((bfacet->fixed) &&
17686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (facet->whitespace != bfacet->whitespace)) {
17687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    FACET_RESTR_FIXED_ERR(facet)
17688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
17690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    default:
17691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
17692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Duplicate found. */
17694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = link->next;
17697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If no duplicate was found: add the base types's facet
17700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to the set.
17701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (link == NULL) {
17703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link = (xmlSchemaFacetLinkPtr)
17704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlMalloc(sizeof(xmlSchemaFacetLink));
17705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (link == NULL) {
17706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPErrMemory(pctxt,
17707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "deriving facets, creating a facet link", NULL);
17708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
17709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->facet = cur->facet;
17711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    link->next = NULL;
17712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (last == NULL)
17713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->facetSet = link;
17714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
17715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		last->next = link;
17716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last = link;
17717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
17723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PERROR_INT("xmlSchemaDeriveAndValidateFacets",
17724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	"an error occured");
17725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
17726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFinishMemberTypeDefinitionsProperty(xmlSchemaParserCtxtPtr pctxt,
17730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					     xmlSchemaTypePtr type)
17731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypeLinkPtr link, lastLink, prevLink, subLink, newLink;
17733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The actual value is then formed by replacing any union type
1773560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * definition in the �explicit members� with the members of their
17736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {member type definitions}, in order.
17737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
17738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: There's a bug entry at
17739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0287.html"
17740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which indicates that we'll keep the union types the future.
17741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    link = type->memberTypes;
17743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (link != NULL) {
17744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED(link->type))
17746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypeFixup(link->type, ACTXT_CAST pctxt);
17747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_UNION(link->type)) {
17749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    subLink = xmlSchemaGetUnionSimpleTypeMemberTypes(link->type);
17750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (subLink != NULL) {
17751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		link->type = subLink->type;
17752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (subLink->next != NULL) {
17753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    lastLink = link->next;
17754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    subLink = subLink->next;
17755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    prevLink = link;
17756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (subLink != NULL) {
17757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink = (xmlSchemaTypeLinkPtr)
17758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlMalloc(sizeof(xmlSchemaTypeLink));
17759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (newLink == NULL) {
17760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPErrMemory(pctxt, "allocating a type link",
17761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				NULL);
17762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
17763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
17764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink->type = subLink->type;
17765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prevLink->next = newLink;
17766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prevLink = newLink;
17767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			newLink->next = lastLink;
17768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			subLink = subLink->next;
17770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
17771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	link = link->next;
17775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixupOptimFacets(xmlSchemaTypePtr type)
1778160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
17782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int has = 0, needVal = 0, normVal = 0;
17783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    has	= (type->baseType->flags & XML_SCHEMAS_TYPE_HAS_FACETS) ? 1 : 0;
17785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has) {
17786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	needVal = (type->baseType->flags &
17787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_FACETSNEEDVALUE) ? 1 : 0;
17788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	normVal = (type->baseType->flags &
17789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_TYPE_NORMVALUENEEDED) ? 1 : 0;
17790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facets != NULL) {
17792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr fac;
1779360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (fac = type->facets; fac != NULL; fac = fac->next) {
17795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    switch (fac->type) {
17796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_WHITESPACE:
17797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_PATTERN:
17799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    normVal = 1;
17800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_FACET_ENUMERATION:
17803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    needVal = 1;
17804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    normVal = 1;
17805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
17808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    has = 1;
17809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1781160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
17812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normVal)
17814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_NORMVALUENEEDED;
17815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (needVal)
17816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
17817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has)
17818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
17819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (has && (! needVal) && WXS_IS_ATOMIC(type)) {
17821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr prim = xmlSchemaGetPrimitiveType(type);
17822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* OPTIMIZE VAL TODO: Some facets need a computed value.
17824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((prim->builtInType != XML_SCHEMAS_ANYSIMPLETYPE) &&
17826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (prim->builtInType != XML_SCHEMAS_STRING)) {
17827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_FACETSNEEDVALUE;
1782860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1782960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
17830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixupWhitespace(xmlSchemaTypePtr type)
17834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1783560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1783660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
17838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the whitespace-facet value.
1783960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
17840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type)) {
17841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
17843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type))
17844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
1784560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
17846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet != NULL) {
17847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetLinkPtr lin;
17848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (lin = type->facetSet; lin != NULL; lin = lin->next) {
17850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (lin->facet->type == XML_SCHEMA_FACET_WHITESPACE) {
17851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		switch (lin->facet->whitespace) {
17852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_PRESERVE:
17853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_REPLACE:
17856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_FACET_COLLAPSE:
17859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
17861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
17862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
17863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
17864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
17865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1786960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * For all �atomic� datatypes other than string (and types �derived�
1787060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * by �restriction� from it) the value of whiteSpace is fixed to
17871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * collapse
17872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
17873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
17874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr anc;
17875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1787660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	for (anc = type->baseType; anc != NULL &&
17877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		anc->builtInType != XML_SCHEMAS_ANYTYPE;
17878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		anc = anc->baseType) {
17879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (anc->type == XML_SCHEMA_TYPE_BASIC) {
1788160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (anc->builtInType == XML_SCHEMAS_NORMSTRING) {
17882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_REPLACE;
17883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((anc->builtInType == XML_SCHEMAS_STRING) ||
1788560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (anc->builtInType == XML_SCHEMAS_ANYSIMPLETYPE)) {
17886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE;
17887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
17889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->flags |= XML_SCHEMAS_TYPE_WHITESPACE_COLLAPSE;
17890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
17892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
17895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
17898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupSimpleTypeStageOne(xmlSchemaParserCtxtPtr pctxt,
17899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
17900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
17902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
17903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED_1(type))
17904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
17905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_FIXUP_1;
17906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_LIST(type)) {
17908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><list>...
17910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->subtypes == NULL) {
17912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one is really needed, so get out.
17914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"list type has no item-type assigned");
17917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
17918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
17920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><union>...
1792260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
17923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->memberTypes == NULL) {
17924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * This one is really needed, so get out.
17926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"union type has no member-types assigned");
17929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
1793060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
1793160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
17932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <simpleType><restriction>...
17934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->baseType == NULL) {
17936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    PERROR_INT("xmlSchemaFixupSimpleTypeStageOne",
17937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type has no base-type assigned");
17938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
17939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_TYPE_NOT_FIXED_1(type->baseType))
17941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaFixupSimpleTypeStageOne(pctxt, type->baseType) == -1)
17942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
17943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
17944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Variety
17945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If the <restriction> alternative is chosen, then the
17946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {variety} of the {base type definition}.
17947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
17948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_ATOMIC(type->baseType))
17949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
17950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (WXS_IS_LIST(type->baseType)) {
17951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
17952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Inherit the itemType.
17954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->subtypes = type->baseType->subtypes;
17956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_IS_UNION(type->baseType)) {
17957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->flags |= XML_SCHEMAS_TYPE_VARIETY_UNION;
17958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
17959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that we won't assign the memberTypes of the base,
17960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * since this will make trouble when freeing them; we will
17961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * use a lookup function to access them instead.
17962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
17963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
17964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
17966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
17967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
17968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
17969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
17970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaDebugFixedType(xmlSchemaParserCtxtPtr pctxt,
17971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaTypePtr type)
17972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
17973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->node != NULL) {
17974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
17975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Type of %s : %s:%d :", name,
17976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        type->node->doc->URL,
17977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGetLineNo(type->node));
17978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
17979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "Type of %s :", name);
17980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
17981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((WXS_IS_SIMPLE(type)) || (WXS_IS_COMPLEX(type))) {
17982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (type->contentType) {
17983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_SIMPLE:
17984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "simple\n");
17985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_ELEMENTS:
17987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "elements\n");
17988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_UNKNOWN:
17990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "unknown !!!\n");
17991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_EMPTY:
17993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "empty\n");
17994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
17995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_MIXED:
17996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsParticleEmptiable((xmlSchemaParticlePtr)
17997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes))
17998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext,
17999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"mixed as emptiable particle\n");
18000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
18001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlGenericError(xmlGenericErrorContext, "mixed\n");
18002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Removed, since not used. */
18004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMA_CONTENT_MIXED_OR_ELEMENTS:
18006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "mixed or elems\n");
18007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_CONTENT_BASIC:
18010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "basic\n");
18011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
18013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
18014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "not registered !!!\n");
18015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
18022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.14.6 Constraints on Simple Type Definition Schema Components
18023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
18024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupSimpleTypeStageTwo(xmlSchemaParserCtxtPtr pctxt,
18026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaTypePtr type)
18027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, olderrs = pctxt->nberrors;
18029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type != XML_SCHEMA_TYPE_SIMPLE)
18031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
18032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->contentType = XML_SCHEMA_CONTENT_SIMPLE;
18038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->baseType == NULL) {
18040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupSimpleTypeStageTwo",
18041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "missing baseType");
18042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
18043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(type->baseType))
18045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeFixup(type->baseType, ACTXT_CAST pctxt);
1804660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
18047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If a member type of a union is a union itself, we need to substitute
18048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * that member type for its member types.
18049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that this might change in WXS 1.1; i.e. we will keep the union
18050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * types in WXS 1.1.
18051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->memberTypes != NULL) &&
18053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaFinishMemberTypeDefinitionsProperty(pctxt, type) == -1))
1805460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
18055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1805660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC src-simple-type 1
18057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The corresponding simple type definition, if any, must satisfy
18058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the conditions set out in Constraints on Simple Type Definition
1805960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Schema Components (�3.14.6)."
18060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Definition Properties Correct
18063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (st-props-correct)
18064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckSTPropsCorrect(pctxt, type);
18066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
1806760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
18068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Derivation Valid (Restriction, Simple)
18069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (cos-st-restricts)
18070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckCOSSTRestricts(pctxt, type);
18072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Removed the error report, since it got annoying to get an
18075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * extra error report, if anything failed until now.
18076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Enable this if needed.
18077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
18078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaPErr(ctxt, type->node,
18079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    XML_SCHEMAP_SRC_SIMPLE_TYPE_1,
18080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    "Simple type '%s' does not satisfy the constraints "
18081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    "on simple type definitions.\n",
18082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *    type->name, NULL);
18083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Simple Type Restriction (Facets)
18086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (st-restrict-facets)
18087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckFacetValues(type, pctxt);
18089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type->facetSet != NULL) ||
18091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(type->baseType->facetSet != NULL)) {
18092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlSchemaDeriveAndValidateFacets(pctxt, type);
18093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	HFAILURE HERROR
18094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Whitespace value.
18097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaTypeFixupWhitespace(type);
18099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
1810060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypeFixupOptimFacets(type);
18101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
18103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupComplexType(xmlSchemaParserCtxtPtr pctxt,
18119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaTypePtr type)
18120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res = 0, olderrs = pctxt->nberrors;
18122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr baseType = type->baseType;
18123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_RESOLVED;
18127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType == NULL) {
18128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaFixupComplexType",
18129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "missing baseType");
18130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
1813160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
18132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fixup the base type.
18134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_TYPE_NOT_FIXED(baseType))
18136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeFixup(baseType, ACTXT_CAST pctxt);
18137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (baseType->flags & XML_SCHEMAS_TYPE_INTERNAL_INVALID) {
18138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip fixup if the base type is invalid.
18140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Generate a warning!
18141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1814360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
18144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This basically checks if the base type can be derived.
18146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckSRCCT(pctxt, type);
1814860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    HFAILURE HERROR
18149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fixup the content type.
18151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->contentType == XML_SCHEMA_CONTENT_SIMPLE) {
18153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><simpleContent>...
18155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_IS_COMPLEX(baseType)) &&
18157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (baseType->contentTypeDef != NULL) &&
18158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (WXS_IS_RESTRICTION(type))) {
18159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr contentBase, content;
18160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
18161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    char buf[30];
18162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *tmpname;
18163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (1) If <restriction> + base type is <complexType>,
18166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "whose own {content type} is a simple type..."
18167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentTypeDef != NULL) {
18169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (1.1) "the simple type definition corresponding to the
18171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <simpleType> among the [children] of <restriction> if there
18172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is one;"
18173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Note that this "<simpleType> among the [children]" was put
18174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* into ->contentTypeDef during parsing.
18175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contentBase = type->contentTypeDef;
18177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef = NULL;
18178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.2) "...otherwise (<restriction> has no <simpleType>
18181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* among its [children]), the simple type definition which
18182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* is the {content type} of the ... base type."
18183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		contentBase = baseType->contentTypeDef;
18185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC
18188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "... a simple type definition which restricts the simple
18189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type definition identified in clause 1.1 or clause 1.2
18190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * with a set of facet components"
18191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
18192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Create the anonymous simple type, which will be the content
18193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * type of the complex type.
18194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_NAMED_LOCALS
18196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    snprintf(buf, 29, "#scST%d", ++(pctxt->counter));
18197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpname = xmlDictLookup(pctxt->dict, BAD_CAST buf, -1);
18198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlSchemaAddType(pctxt, pctxt->schema,
18199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, tmpname, type->targetNamespace,
18200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->node, 0);
18201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
18202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content = xmlSchemaAddType(pctxt, pctxt->schema,
18203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL, type->targetNamespace,
18204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->node, 0);
18205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (content == NULL)
18207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We will use the same node as for the <complexType>
18210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to have it somehow anchored in the schema doc.
18211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->type = XML_SCHEMA_TYPE_SIMPLE;
18213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->baseType = contentBase;
18214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Move the facets, previously anchored on the
18216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * complexType during parsing.
18217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->facets = type->facets;
18219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->facets = NULL;
18220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    content->facetSet = type->facetSet;
18221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->facetSet = NULL;
1822260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = content;
18224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_TYPE_NOT_FIXED(contentBase))
18225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypeFixup(contentBase, ACTXT_CAST pctxt);
18226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Fixup the newly created type. We don't need to check
18228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * for circularity here.
18229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaFixupSimpleTypeStageOne(pctxt, content);
1823160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    HFAILURE HERROR
18232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaFixupSimpleTypeStageTwo(pctxt, content);
1823360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    HFAILURE HERROR
1823460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_COMPLEX(baseType)) &&
18236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (baseType->contentType == XML_SCHEMA_CONTENT_MIXED) &&
18237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (WXS_IS_RESTRICTION(type))) {
18238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2) If <restriction> + base is a mixed <complexType> with
18240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * an emptiable particle, then a simple type definition which
18241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * restricts the <restriction>'s <simpleType> child.
18242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((type->contentTypeDef == NULL) ||
18244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(type->contentTypeDef->baseType == NULL)) {
18245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check if this ever happens.
18247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
18249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_INTERNAL,
18250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
18251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Internal error: xmlSchemaTypeFixup, "
18252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "complex type '%s': the <simpleContent><restriction> "
18253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "is missing a <simpleType> child, but was not catched "
18254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "by xmlSchemaCheckSRCCT()", type->name);
18255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_COMPLEX(baseType)) && WXS_IS_EXTENSION(type)) {
18258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3) If <extension> + base is <complexType> with
18260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * <simpleType> content, "...then the {content type} of that
18261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * complex type definition"
18262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (baseType->contentTypeDef == NULL) {
18264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Check if this ever happens. xmlSchemaCheckSRCCT
18266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* should have catched this already.
18267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErr(pctxt,
18269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_INTERNAL,
18270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST type, NULL,
18271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Internal error: xmlSchemaTypeFixup, "
18272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "complex type '%s': the <extension>ed base type is "
18273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "a complex type with no simple content type",
18274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->name);
18275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit_failure;
18276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = baseType->contentTypeDef;
18278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((WXS_IS_SIMPLE(baseType)) && WXS_IS_EXTENSION(type)) {
18279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (4) <extension> + base is <simpleType>
18281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "... then that simple type definition"
18282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentTypeDef = baseType;
18284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Check if this ever happens.
18287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
18289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
18290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST type, NULL,
18291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaTypeFixup, "
18292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"complex type '%s' with <simpleContent>: unhandled "
18293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"derivation case", type->name);
18294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit_failure;
18295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
18297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int dummySequence = 0;
18298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParticlePtr particle =
18299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlSchemaParticlePtr) type->subtypes;
18300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Corresponds to <complexType><complexContent>...
18302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
18303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE that the effective mixed was already set during parsing of
18304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* <complexType> and <complexContent>; its flag value is
18305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML_SCHEMAS_TYPE_MIXED.
18306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
18307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compute the "effective content":
18308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (2.1.1) + (2.1.2) + (2.1.3)
18309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((particle == NULL) ||
18311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->type == XML_SCHEMA_TYPE_PARTICLE) &&
18312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->children->type == XML_SCHEMA_TYPE_ALL) ||
18313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (particle->children->type == XML_SCHEMA_TYPE_SEQUENCE) ||
18314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((particle->children->type == XML_SCHEMA_TYPE_CHOICE) &&
18315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (particle->minOccurs == 0))) &&
18316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ( ((xmlSchemaTreeItemPtr) particle->children)->children == NULL))) {
18317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->flags & XML_SCHEMAS_TYPE_MIXED) {
18318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1831960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* SPEC (2.1.4) "If the �effective mixed� is true, then
18320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* a particle whose properties are as follows:..."
18321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
18322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Empty sequence model group with
18323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* minOccurs/maxOccurs = 1 (i.e. a "particle emptiable").
18324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that we sill assign it the <complexType> node to
18325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* somehow anchor it in the doc.
18326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((particle == NULL) ||
18328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (particle->children->type != XML_SCHEMA_TYPE_SEQUENCE)) {
18329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the particle.
18331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = xmlSchemaAddParticle(pctxt,
18333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node, 1, 1);
18334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle == NULL)
18335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the model group.
18338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */ /* URGENT TODO: avoid adding to pending items. */
18339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children = (xmlSchemaTreeItemPtr)
18340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SEQUENCE, type->node);
18342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children == NULL)
18343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
1834460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->subtypes = (xmlSchemaTypePtr) particle;
18346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dummySequence = 1;
18348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (2.1.5) "otherwise empty"
18352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = XML_SCHEMA_CONTENT_EMPTY;
18354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.2) "otherwise the particle corresponding to the
18358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * <all>, <choice>, <group> or <sequence> among the
18359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [children]."
18360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type->contentType = XML_SCHEMA_CONTENT_ELEMENTS;
18362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Compute the "content type".
18365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_RESTRICTION(type)) {
18367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.1) "If <restriction>..."
18369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1.1) + (3.1.2) */
18370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentType != XML_SCHEMA_CONTENT_EMPTY) {
18371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
18372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
18373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
18375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (3.2) "If <extension>..."
18377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (type->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.1)
1838160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* "If the �effective content� is empty, then the
18382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*  {content type} of the [...] base ..."
18383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentType = baseType->contentType;
18385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->subtypes = baseType->subtypes;
18386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Fixes bug #347316:
18388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This is the case when the base type has a simple
18389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type definition as content.
18390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type->contentTypeDef = baseType->contentTypeDef;
18392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that the effective mixed is ignored here.
18394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (baseType->contentType == XML_SCHEMA_CONTENT_EMPTY) {
18396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.2)
18398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
18400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
18401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (3.2.3)
18404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->flags & XML_SCHEMAS_TYPE_MIXED)
18406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    type->contentType = XML_SCHEMA_CONTENT_MIXED;
18407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * "A model group whose {compositor} is sequence and whose
18409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * {particles} are..."
18410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_PARTICLE(type) != NULL) &&
18412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_PARTICLE_TERM(type) != NULL) &&
18413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((WXS_TYPE_PARTICLE_TERM(type))->type ==
18414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_ALL))
18415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
18416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC cos-all-limited (1)
18418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
18421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
18422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(type), NULL,
18423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The type has an 'all' model group in its "
18424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"{content type} and thus cannot be derived from "
18425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"a non-empty type, since this would produce a "
18426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'sequence' model group containing the 'all' "
18427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"model group; 'all' model groups are not "
18428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allowed to appear inside other model groups",
18429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
18430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if ((WXS_TYPE_PARTICLE(baseType) != NULL) &&
18432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_PARTICLE_TERM(baseType) != NULL) &&
18433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((WXS_TYPE_PARTICLE_TERM(baseType))->type ==
18434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_ALL))
18435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
18436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC cos-all-limited (1)
18438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* TODO: error code */
18441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_COS_ALL_LIMITED,
18442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ITEM_NODE(type), NULL,
18443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"A type cannot be derived by extension from a type "
18444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"which has an 'all' model group in its "
18445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"{content type}, since this would produce a "
18446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'sequence' model group containing the 'all' "
18447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"model group; 'all' model groups are not "
18448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allowed to appear inside other model groups",
18449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
18450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (! dummySequence) {
18452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaTreeItemPtr effectiveContent =
18453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) type->subtypes;
18454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the particle.
18456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = xmlSchemaAddParticle(pctxt,
18458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node, 1, 1);
18459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle == NULL)
18460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create the "sequence" model group.
18463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children = (xmlSchemaTreeItemPtr)
18465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAddModelGroup(pctxt, pctxt->schema,
18466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMA_TYPE_SEQUENCE, type->node);
18467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children == NULL)
18468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_TYPE_CONTENTTYPE(type) = (xmlSchemaTypePtr) particle;
18470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC "the particle of the {content type} of
18472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the ... base ..."
18473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Create a duplicate of the base type's particle
18474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * and assign its "term" to it.
18475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children->children =
18477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) xmlSchemaAddParticle(pctxt,
18478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			type->node,
18479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParticlePtr) type->subtypes)->minOccurs,
18480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParticlePtr) type->subtypes)->maxOccurs);
18481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (particle->children->children == NULL)
18482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit_failure;
18483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle = (xmlSchemaParticlePtr)
18484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			particle->children->children;
18485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children =
18486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParticlePtr) baseType->subtypes)->children;
18487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
1848860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * SPEC "followed by the �effective content�."
18489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->next = effectiveContent;
18491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This all will result in:
18493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * new-particle
18494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *   --> new-sequence(
18495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *         new-particle
18496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *           --> base-model,
18497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *         this-particle
18498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *	        --> this-model
18499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *	    )
18500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
18502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the case when there is already an empty
18504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <sequence> with minOccurs==maxOccurs==1.
18505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Just add the base types's content type.
18506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * NOTE that, although we miss to add an intermediate
18507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * <sequence>, this should produce no difference to
18508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * neither the regex compilation of the content model,
18509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * nor to the complex type contraints.
18510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
18511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    particle->children->children =
18512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTreeItemPtr) baseType->subtypes;
18513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now fixup attribute uses:
18519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - expand attr. group references
18520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *     - intersect attribute wildcards
18521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - inherit attribute uses of the base type
18522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - inherit or union attr. wildcards if extending
18523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - apply attr. use prohibitions if restricting
18524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaFixupTypeAttributeUses(pctxt, type);
18526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply the complex type component constraints; this will not
18529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * check attributes, since this is done in
18530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaFixupTypeAttributeUses().
18531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaCheckCTComponent(pctxt, type);
18533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    HFAILURE HERROR
18534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
18541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_error:
18544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(pctxt->err);
18549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type->flags |= XML_SCHEMAS_TYPE_INTERNAL_INVALID;
18552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_TYPE
18553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaDebugFixedType(pctxt, type);
18554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
18555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaTypeFixup:
18561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
18563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Fixes the content model of the type.
18565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * URGENT TODO: We need an int result!
18566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaTypeFixup(xmlSchemaTypePtr type,
18569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlSchemaAbstractCtxtPtr actxt)
18570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
18572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
18573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actxt->type != XML_SCHEMA_CTXT_PARSER) {
18574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	AERROR_INT("xmlSchemaTypeFixup",
18575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "this function needs a parser context");
18576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
18577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_TYPE_NOT_FIXED(type))
18579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
18580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_COMPLEX)
18581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaFixupComplexType(PCTXT_CAST actxt, type));
18582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (type->type == XML_SCHEMA_TYPE_SIMPLE)
18583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(xmlSchemaFixupSimpleTypeStageTwo(PCTXT_CAST actxt, type));
18584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckFacet:
18589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet
18590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the schema parser context or NULL
18592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name: the optional name of the type
18593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks and computes the values of facets.
18595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if valid, a positive error code if not valid and
18597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         -1 in case of an internal or API error.
18598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
18600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacet(xmlSchemaFacetPtr facet,
18601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSchemaTypePtr typeDecl,
18602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSchemaParserCtxtPtr pctxt,
18603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar * name ATTRIBUTE_UNUSED)
18604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, ctxtGiven;
18606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((facet == NULL) || (typeDecl == NULL))
18608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
18609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: will the parser context be given if used from
18611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the relaxNG module?
18612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
18614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxtGiven = 0;
18615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
18616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxtGiven = 1;
18617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (facet->type) {
18619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MININCLUSIVE:
18620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINEXCLUSIVE:
18621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXINCLUSIVE:
18622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
18623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_FACET_ENUMERATION: {
18624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
18625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Okay we need to validate the value
18626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * at that point.
18627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
18628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTypePtr base;
18629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* 4.3.5.5 Constraints on enumeration Schema Components
18631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Schema Component Constraint: enumeration valid restriction
1863260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* It is an �error� if any member of {value} is not in the
1863360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �value space� of {base type definition}.
18634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
18635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* minInclusive, maxInclusive, minExclusive, maxExclusive:
1863660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* The value �must� be in the
1863760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �value space� of the �base type�.
18638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* This function is intended to deliver a compiled value
18641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* on the facet. In this implementation of XML Schemata the
18642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type holding a facet, won't be a built-in type.
18643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Thus to ensure that other API
18644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* calls (relaxng) do work, if the given type is a built-in
18645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type, we will assume that the given built-in type *is
18646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* already* the base type.
18647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (typeDecl->type != XML_SCHEMA_TYPE_BASIC) {
18649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base = typeDecl->baseType;
18650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (base == NULL) {
18651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "a type user derived type has no base type");
18653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
18654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
18656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    base = typeDecl;
1865760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! ctxtGiven) {
18659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
18660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * A context is needed if called from RelaxNG.
1866160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
18662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pctxt = xmlSchemaNewParserCtxt("*");
18663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (pctxt == NULL)
18664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
18665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE: This call does not check the content nodes,
18668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* since they are not available:
18669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* facet->node is just the node holding the facet
18670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* definition, *not* the attribute holding the *value*
18671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of the facet.
1867260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
18673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(
18674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ACTXT_CAST pctxt, facet->node, base,
18675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val), 1, 1, 0);
18676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
18677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
18678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* No error message for RelaxNG. */
1867960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			if (ctxtGiven) {
18680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMAP_INTERNAL, facet->node, NULL,
1868260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				"Internal error: xmlSchemaCheckFacet, "
18683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"failed to validate the value '%s' of the "
18684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"facet '%s' against the base type",
18685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				facet->value, xmlSchemaFacetTypeToString(facet->type));
18686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
18687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
18688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* No error message for RelaxNG. */
18691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
18693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
18695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, facet->node, WXS_BASIC_CAST facet,
18696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The value '%s' of the facet does not validate "
18697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "against the base type '%s'",
18698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    facet->value,
18699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaFormatQName(&str,
18700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				base->targetNamespace, base->name));
18701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
18702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit;
18704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (facet->val == NULL) {
18705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "value was not computed");
18708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
18710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
18712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_PATTERN:
18714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            facet->regexp = xmlRegexpCompile(facet->value);
18715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (facet->regexp == NULL) {
18716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_REGEXP_INVALID;
18717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* No error message for RelaxNG. */
18718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxtGiven) {
18719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST pctxt,
18720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret, facet->node, WXS_BASIC_CAST typeDecl,
18721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The value '%s' of the facet 'pattern' is not a "
18722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"valid regular expression",
18723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			facet->value, NULL);
18724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
18727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_TOTALDIGITS:
18728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_FRACTIONDIGITS:
18729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_LENGTH:
18730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXLENGTH:
18731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINLENGTH:
18732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
18734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidatePredefinedType(
18735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_PINTEGER),
18736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val));
18737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
18738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidatePredefinedType(
18739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_NNINTEGER),
18740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet->value, &(facet->val));
18741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
18743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
18744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* No error message for RelaxNG. */
18745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			PERROR_INT("xmlSchemaCheckFacet",
18747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "validating facet value");
18748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
18749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
18750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* No error message for RelaxNG. */
18753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxtGiven) {
18754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* error code */
18755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr4(ACTXT_CAST pctxt,
18756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret, facet->node, WXS_BASIC_CAST typeDecl,
1875760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			"The value '%s' of the facet '%s' is not a valid '%s'",
18758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			facet->value,
18759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFacetTypeToString(facet->type),
1876060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			(facet->type != XML_SCHEMA_FACET_TOTALDIGITS) ?
18761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    BAD_CAST "nonNegativeInteger" :
18762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    BAD_CAST "positiveInteger",
18763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
18764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
18766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
1876760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
18768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_WHITESPACE:{
18769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(facet->value, BAD_CAST "preserve")) {
18770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_PRESERVE;
18771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(facet->value, BAD_CAST "replace")) {
18772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_REPLACE;
18773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(facet->value, BAD_CAST "collapse")) {
18774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    facet->whitespace = XML_SCHEMAS_FACET_COLLAPSE;
18775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
18776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAP_INVALID_FACET_VALUE;
18777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* No error message for RelaxNG. */
18778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxtGiven) {
18779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* error was previously: XML_SCHEMAP_INVALID_WHITE_SPACE */
18780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
18781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, facet->node, WXS_BASIC_CAST typeDecl,
18782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The value '%s' of the facet 'whitespace' is not "
18783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "valid", facet->value, NULL);
18784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
18785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
18786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
18787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
18788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
18789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
18791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! ctxtGiven) && (pctxt != NULL))
18792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(pctxt);
18793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
18794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
18795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! ctxtGiven) && (pctxt != NULL))
18796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(pctxt);
18797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
18798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckFacetValues:
18802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @typeDecl:  the schema type definition
18803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
18804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks the default values types, especially for facets
18806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
18808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl,
18809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaParserCtxtPtr pctxt)
18810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, olderrs = pctxt->nberrors;
18812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name = typeDecl->name;
18813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: It is intended to use the facets list, instead
18815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of facetSet.
18816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typeDecl->facets != NULL) {
18818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFacetPtr facet = typeDecl->facets;
18819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Temporarily assign the "schema" to the validation context
18822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the parser context. This is needed for NOTATION validation.
18823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->vctxt == NULL) {
18825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCreateVCtxtOnPCtxt(pctxt) == -1)
18826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
18827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->vctxt->schema = pctxt->schema;
18829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (facet != NULL) {
18830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaCheckFacet(facet, typeDecl, pctxt, name);
18831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    HFAILURE
18832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    facet = facet->next;
18833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->vctxt->schema = NULL;
18835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (olderrs != pctxt->nberrors)
18837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(pctxt->err);
18838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
18839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
18840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
18841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetCircModelGrDefRef:
18845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtMGroup: the searched model group
18846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @selfMGroup: the second searched model group
18847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle: the first particle
18848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used by
18850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckGroupDefCircular only.
18851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the particle with the circular model group definition reference,
18853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * otherwise NULL.
18854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaTreeItemPtr
18856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetCircModelGrDefRef(xmlSchemaModelGroupDefPtr groupDef,
18857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaTreeItemPtr particle)
18858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr circ = NULL;
18860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr term;
18861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupDefPtr gdef;
18862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (; particle != NULL; particle = particle->next) {
18864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	term = particle->children;
18865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (term == NULL)
18866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
18867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (term->type) {
18868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
18869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gdef = (xmlSchemaModelGroupDefPtr) term;
18870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef == groupDef)
18871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (particle);
18872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
18873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Mark this model group definition to avoid infinite
18874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* recursion on circular references not yet examined.
18875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
18876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef->flags & XML_SCHEMA_MODEL_GROUP_DEF_MARKED)
18877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
18878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (gdef->children != NULL) {
18879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    gdef->flags |= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    circ = xmlSchemaGetCircModelGrDefRef(groupDef,
18881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			gdef->children->children);
18882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    gdef->flags ^= XML_SCHEMA_MODEL_GROUP_DEF_MARKED;
18883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (circ != NULL)
18884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (circ);
18885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
18886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
18888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
18889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
18890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		circ = xmlSchemaGetCircModelGrDefRef(groupDef, term->children);
18891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (circ != NULL)
18892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (circ);
18893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
18895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
18896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
18899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckGroupDefCircular:
18903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  the model group definition
18904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
18905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
18906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular references to model group definitions.
18908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
18910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckGroupDefCircular(xmlSchemaModelGroupDefPtr item,
18911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaParserCtxtPtr ctxt)
18912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
18914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Model Group Correct
18915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2 Circular groups are disallowed. That is, within the {particles}
18916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * of a group there must not be at any depth a particle whose {term}
18917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * is the group itself.
18918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
18919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((item == NULL) ||
18920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->type != XML_SCHEMA_TYPE_GROUP) ||
18921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(item->children == NULL))
18922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
18923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
18924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTreeItemPtr circ;
18925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	circ = xmlSchemaGetCircModelGrDefRef(item, item->children->children);
18927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
18928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
18929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: The error report is not adequate: this constraint
18931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * is defined for model groups but not definitions, but since
18932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * there cannot be any circular model groups without a model group
18933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition (if not using a construction API), we check those
18934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * defintions only.
18935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
18937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_MG_PROPS_CORRECT_2,
18938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(circ),
18939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Circular reference to the model group definition '%s' "
18940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"defined", xmlSchemaFormatQName(&str,
18941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item->targetNamespace, item->name));
18942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str)
18943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: We will cut the reference to avoid further
18945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * confusion of the processor. This is a fatal error.
18946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ->children = NULL;
18948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
18953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaModelGroupToModelGroupDefFixup:
18954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
18955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mg:  the model group
18956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Assigns the model group of model group definitions to the "term"
18958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the referencing particle.
18959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In xmlSchemaResolveModelGroupParticleReferences the model group
18960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * definitions were assigned to the "term", since needed for the
18961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * circularity check.
18962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
18963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
18964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     All Group Limited (cos-all-limited) (1.2)
18965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
18966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
18967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaModelGroupToModelGroupDefFixup(
18968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
18969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr mg)
18970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
18972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (particle != NULL) {
18974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
18975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_PARTICLE_TERM(particle))->type !=
18976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_GROUP))
18977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
18978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle = WXS_PTC_CAST particle->next;
18979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
1898060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
18981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle)) == NULL) {
18982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
18983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Remove the particle.
18984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
18985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_PARTICLE_TERM(particle) = NULL;
18986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle = WXS_PTC_CAST particle->next;
18987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
18988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
18989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
18990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Assign the model group to the {term} of the particle.
18991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
18992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_PARTICLE_TERM(particle) =
18993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_TREE_CAST WXS_MODELGROUPDEF_MODEL(WXS_PARTICLE_TERM(particle));
18994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = WXS_PTC_CAST particle->next;
18996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
18997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
18998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
18999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircularRecur:
19001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtGr: the searched attribute group
19002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr: the current attribute list to be processed
19003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This one is intended to be used by
19005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircular only.
19006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the circular attribute grou reference, otherwise NULL.
19008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaQNameRefPtr
19010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrGroupCircularRecur(xmlSchemaAttributeGroupPtr ctxtGr,
19011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				     xmlSchemaItemListPtr list)
19012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr gr;
19014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref, circ;
19015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
19016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We will search for an attribute group reference which
19018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * references the context attribute group.
19019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->nbItems; i++) {
19021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = list->items[i];
19022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ref->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ref->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP) &&
19024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (ref->item != NULL))
19025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    gr = WXS_ATTR_GROUP_CAST ref->item;
19027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr == ctxtGr)
19028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(ref);
19029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr->flags & XML_SCHEMAS_ATTRGROUP_MARKED)
1903060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
19031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Mark as visited to avoid infinite recursion on
19033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * circular references not yet examined.
19034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((gr->attrUses) &&
19036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(gr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS))
19037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
19038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gr->flags |= XML_SCHEMAS_ATTRGROUP_MARKED;
19039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		circ = xmlSchemaCheckAttrGroupCircularRecur(ctxtGr,
1904060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (xmlSchemaItemListPtr) gr->attrUses);
19041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		gr->flags ^= XML_SCHEMAS_ATTRGROUP_MARKED;
19042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (circ != NULL)
19043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (circ);
19044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1904560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
19049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrGroupCircular:
19053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * attrGr:  the attribute group definition
19054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
19055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name
19056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks for circular references of attribute groups.
19058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrGroupCircular(xmlSchemaAttributeGroupPtr attrGr,
19061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaParserCtxtPtr ctxt)
19062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Representation Constraint:
19065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute Group Definition Representation OK
19066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3 Circular group reference is disallowed outside <redefine>.
19067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * That is, unless this element information item's parent is
19068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * <redefine>, then among the [children], if any, there must
19069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not be an <attributeGroup> with ref [attribute] which resolves
19070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the component corresponding to this <attributeGroup>. Indirect
19071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * circularity is also ruled out. That is, when QName resolution
1907260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * (Schema Document) (�3.15.3) is applied to a �QName� arising from
19073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * any <attributeGroup>s with a ref [attribute] among the [children],
1907460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * it must not be the case that a �QName� is encountered at any depth
19075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * which resolves to the component corresponding to this <attributeGroup>.
19076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrGr->attrUses == NULL)
19078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if ((attrGr->flags & XML_SCHEMAS_ATTRGROUP_HAS_REFS) == 0)
19080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
19082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr circ;
1908360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	circ = xmlSchemaCheckAttrGroupCircularRecur(attrGr,
1908560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    (xmlSchemaItemListPtr) attrGr->attrUses);
19086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
19087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
19088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Report the referenced attr group as QName.
19090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
19092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_ATTRIBUTE_GROUP_3,
19093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(WXS_BASIC_CAST circ),
19094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Circular reference to the attribute group '%s' "
19095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"defined", xmlSchemaGetComponentQName(&str, attrGr));
19096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
19097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: We will cut the reference to avoid further
19099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * confusion of the processor.
19100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * BADSPEC TODO: The spec should define how to process in this case.
19101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ->item = NULL;
19103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
19104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr);
19112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaExpandAttributeGroupRefs:
19115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the parser context
19116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node of the component holding the attribute uses
1911760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @completeWild: the intersected wildcard to be returned
19118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list: the attribute uses
19119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
19122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute use prohibitions are removed from the list
19123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and returned via the @prohibs list.
19124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pointlessness of attr. prohibs, if a matching attr. decl
19125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is existent a well, are checked.
19126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaExpandAttributeGroupRefs(xmlSchemaParserCtxtPtr pctxt,
19129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaBasicItemPtr item,
19130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaWildcardPtr *completeWild,
19131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr list,
19132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaItemListPtr prohibs)
19133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr gr;
19135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr use;
19136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr sublist;
19137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
19138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int created = (*completeWild == NULL) ? 0 : 1;
19139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohibs)
19141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohibs->nbItems = 0;
19142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < list->nbItems; i++) {
19144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	use = list->items[i];
19145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1914660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (use->type == XML_SCHEMA_EXTRA_ATTR_USE_PROHIB) {
19147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (prohibs == NULL) {
19148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaExpandAttributeGroupRefs",
19149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "unexpected attr prohibition found");
19150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Remove from attribute uses.
19154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListRemove(list, i) == -1)
19156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i--;
19158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that duplicate prohibitions were already
19160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * handled at parsing time.
1916160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
19162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add to list of prohibitions.
19164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListAddSize(prohibs, 2, use);
19166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
19167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((use->type == XML_SCHEMA_EXTRA_QNAMEREF) &&
19169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_QNAME_CAST use)->itemType == XML_SCHEMA_TYPE_ATTRIBUTEGROUP))
19170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_QNAME_CAST use)->item == NULL)
19172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    gr = WXS_ATTR_GROUP_CAST (WXS_QNAME_CAST use)->item;
19174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Expand the referenced attr. group.
19176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: remove this, this is done in a previous step, so
19177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * already done here.
19178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((gr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED) == 0) {
19180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaAttributeGroupExpandRefs(pctxt, gr) == -1)
19181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
19182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Build the 'complete' wildcard; i.e. intersect multiple
19185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * wildcards.
19186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (gr->attributeWildcard != NULL) {
19188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*completeWild == NULL) {
19189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *completeWild = gr->attributeWildcard;
19190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
19191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! created) {
19192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaWildcardPtr tmpWild;
19193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 /*
19195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Copy the first encountered wildcard as context,
19196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* except for the annotation.
19197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*
19198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Although the complete wildcard might not correspond
19199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* to any node in the schema, we will anchor it on
19200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the node of the owner component.
19201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
19202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmpWild =  xmlSchemaAddWildcard(pctxt, pctxt->schema,
19203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMA_TYPE_ANY_ATTRIBUTE,
19204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(item));
19205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (tmpWild == NULL)
19206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
19207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaCloneWildcardNsConstraints(pctxt,
19208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    tmpWild, *completeWild) == -1)
19209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
19210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			tmpWild->processContents = (*completeWild)->processContents;
19211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*completeWild = tmpWild;
19212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			created = 1;
19213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1921460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIntersectWildcards(pctxt, *completeWild,
19216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			gr->attributeWildcard) == -1)
19217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Just remove the reference if the referenced group does not
19222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * contain any attribute uses.
19223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sublist = ((xmlSchemaItemListPtr) gr->attrUses);
19225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((sublist == NULL) || sublist->nbItems == 0) {
19226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaItemListRemove(list, i) == -1)
19227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
19228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i--;
19229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add the attribute uses.
19233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    list->items[i] = sublist->items[0];
19235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sublist->nbItems != 1) {
19236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 1; j < sublist->nbItems; j++) {
19237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
19238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaItemListInsert(list,
19239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    sublist->items[j], i) == -1)
19240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle pointless prohibitions of declared attributes.
19248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prohibs && (prohibs->nbItems != 0) && (list->nbItems != 0)) {
19250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUseProhibPtr prohib;
19251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = prohibs->nbItems -1; i >= 0; i--) {
19253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    prohib = prohibs->items[i];
19254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (j = 0; j < list->nbItems; j++) {
19255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		use = list->items[j];
19256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((prohib->name == WXS_ATTRUSE_DECL_NAME(use)) &&
19258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (prohib->targetNamespace == WXS_ATTRUSE_DECL_TNS(use)))
19259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
19260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
19261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomWarning(ACTXT_CAST pctxt,
19263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAP_WARN_ATTR_POINTLESS_PROH,
19264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			prohib->node, NULL,
19265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Skipping pointless attribute use prohibition "
19266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"'%s', since a corresponding attribute use "
19267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"exists already in the type definition",
19268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
19269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    prohib->targetNamespace, prohib->name),
19270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL);
19271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
19272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
19273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Remove the prohibition.
19274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
19275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaItemListRemove(prohibs, i) == -1)
19276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
19277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeGroupExpandRefs:
19287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the parser context
1928860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @attrGr:  the attribute group definition
19289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Computation of:
19291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * {attribute uses} property
19292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * {attribute wildcard} property
19293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
19296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAttributeGroupExpandRefs(xmlSchemaParserCtxtPtr pctxt,
19299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr)
1930060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
19301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attrGr->attrUses == NULL) ||
19302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(attrGr->flags & XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED))
19303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrGr->flags |= XML_SCHEMAS_ATTRGROUP_WILDCARD_BUILDED;
19306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaExpandAttributeGroupRefs(pctxt, WXS_BASIC_CAST attrGr,
19307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&(attrGr->attributeWildcard), attrGr->attrUses, NULL) == -1)
1930860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(-1);
19309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAttributeGroupExpandRefs:
19314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  the parser context
1931560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @attrGr:  the attribute group definition
19316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitutes contained attribute group references
19318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for their attribute uses. Wilcards are intersected.
1931960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
19320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
1932160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *    Attribute Group Definition Properties Correct (ag-props-correct)
19322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAGPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaAttributeGroupPtr attrGr)
1932660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
19327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC ag-props-correct
19329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (1) "The values of the properties of an attribute group definition
19330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be as described in the property tableau in The Attribute
1933160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Group Definition Schema Component (�3.6.1), modulo the impact of
1933260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Missing Sub-components (�5.3);"
19333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1933460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((attrGr->attrUses != NULL) &&
19336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_LIST_CAST attrGr->attrUses)->nbItems > 1)
19337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
19338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListPtr uses = WXS_LIST_CAST attrGr->attrUses;
19339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttributeUsePtr use, tmp;
19340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j, hasId = 0;
19341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = uses->nbItems -1; i >= 0; i--) {
1934360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    use = uses->items[i];
19344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ag-props-correct
19346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (2) "Two distinct members of the {attribute uses} must not have
19347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute declaration}s both of whose {name}s match and whose
19348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace}s are identical."
19349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (i > 0) {
19351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = i -1; j >= 0; j--) {
19352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmp = uses->items[j];
19353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((WXS_ATTRUSE_DECL_NAME(use) ==
19354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_NAME(tmp)) &&
19355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(WXS_ATTRUSE_DECL_TNS(use) ==
19356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTRUSE_DECL_TNS(tmp)))
19357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
19358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1935960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
19362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrGr->node, WXS_BASIC_CAST attrGr,
19363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "Duplicate %s",
19364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
19365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
19366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
19367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
19368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate.
19369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
19370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
19371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
19372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_use;
19373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
19374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC ag-props-correct
19378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3) "Two distinct members of the {attribute uses} must not have
19379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {attribute declaration}s both of whose {type definition}s are or
19380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * are derived from ID."
19381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Does 'derived' include member-types of unions?
19382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
1938360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (WXS_ATTRUSE_TYPEDEF(use) != NULL) {
19384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIsDerivedFromBuiltInType(
19385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
1938660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		{
19387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (hasId) {
19388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *str = NULL;
1938960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_AG_PROPS_CORRECT,
19392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    attrGr->node, WXS_BASIC_CAST attrGr,
19393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "There must not exist more than one attribute "
19394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "declaration of type 'xs:ID' "
19395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "(or derived from 'xs:ID'). The %s violates this "
19396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "constraint",
19397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&str, use),
19398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
19399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(str);
19400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListRemove(uses, i) == -1)
19401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return(-1);
1940260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
19403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    hasId = 1;
19404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_use: {}
19407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrGroupReferences:
19414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attrgrpDecl:  the schema attribute definition
19415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
19416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
19417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves references to attribute group definitions.
19419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrGroupReferences(xmlSchemaQNameRefPtr ref,
19422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParserCtxtPtr ctxt)
19423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeGroupPtr group;
19425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ref->item != NULL)
19427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
19428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    group = xmlSchemaGetAttributeGroup(ctxt->schema,
19429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref->name,
19430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref->targetNamespace);
19431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (group == NULL) {
19432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPResCompAttrErr(ctxt,
19433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_RESOLVE,
19434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, ref->node,
19435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "ref", ref->name, ref->targetNamespace,
19436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->itemType, NULL);
19437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
19438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ref->item = WXS_BASIC_CAST group;
19440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrPropsCorrect:
19445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an schema attribute declaration/use
19446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *    Attribute Declaration Properties Correct (a-props-correct)
19452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value constraints of an attribute declaration/use.
19454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that this needs the simle type definitions to be already
19455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   builded and checked.
19456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaAttributePtr attr)
19460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC a-props-correct (1)
19464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The values of the properties of an attribute declaration must
19465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be as described in the property tableau in The Attribute
1946660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Declaration Schema Component (�3.2.1), modulo the impact of
1946760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Missing Sub-components (�5.3)."
19468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
1946960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_ATTR_TYPEDEF(attr) == NULL)
19471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->defValue != NULL) {
19474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
19475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (3)
19478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "If the {type definition} is or is derived from ID then there
19479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* must not be a {value constraint}."
19480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIsDerivedFromBuiltInType(
19482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ATTR_TYPEDEF(attr), XML_SCHEMAS_ID))
19483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
19484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
19485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_A_PROPS_CORRECT_3,
19486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST attr,
19487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Value constraints are not allowed if the type definition "
19488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"is or is derived from xs:ID",
19489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
19490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
19491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (2)
19494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "if there is a {value constraint}, the canonical lexical
1949560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of its value must be �valid� with respect
1949660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to the {type definition} as defined in String Valid (�3.14.4)."
19497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Don't care about the *cononical* stuff here, this requirement
19498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* will be removed in WXS 1.1 anyway.
19499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST pctxt,
19501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->node, WXS_ATTR_TYPEDEF(attr),
19502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->defValue, &(attr->defVal),
19503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    1, 1, 0);
19504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
19505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
19506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaCheckAttrPropsCorrect",
19507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
19508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
19511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_A_PROPS_CORRECT_2,
19512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST attr,
19513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the value constraint is not valid",
19514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
19515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
19516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1951860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaElementPtr
19523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSubstGroupCircular(xmlSchemaElementPtr elemDecl,
19524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 xmlSchemaElementPtr ancestor)
19525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr ret;
19527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor) == NULL)
19529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
19530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor) == elemDecl)
19531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ancestor);
19532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(ancestor)->flags & XML_SCHEMAS_ELEM_CIRCULAR)
19534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
19535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_SUBST_HEAD(ancestor)->flags |= XML_SCHEMAS_ELEM_CIRCULAR;
19536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckSubstGroupCircular(elemDecl,
19537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_SUBST_HEAD(ancestor));
19538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    WXS_SUBST_HEAD(ancestor)->flags ^= XML_SCHEMAS_ELEM_CIRCULAR;
19539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
19541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElemPropsCorrect:
19545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @decl: the element declaration
19547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Element Declaration Properties Correct (e-props-correct)
19551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
19553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   missing: (6)
19554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElemPropsCorrect(xmlSchemaParserCtxtPtr pctxt,
19557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaElementPtr elemDecl)
19558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
19560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typeDef = WXS_ELEM_TYPEDEF(elemDecl);
19561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (1) "The values of the properties of an element declaration
19563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be as described in the property tableau in The Element
1956460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Declaration Schema Component (�3.3.1), modulo the impact of Missing
1956560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
19566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_SUBST_HEAD(elemDecl) != NULL) {
19568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr head = WXS_SUBST_HEAD(elemDecl), circ;
19569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckElementDeclComponent(head, pctxt);
19571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
1957260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* SPEC (3) "If there is a non-�absent� {substitution group
19573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* affiliation}, then {scope} must be global."
19574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((elemDecl->flags & XML_SCHEMAS_ELEM_GLOBAL) == 0) {
19576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(pctxt,
19577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_E_PROPS_CORRECT_3,
19578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST elemDecl, NULL,
19579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Only global element declarations can have a "
19580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitution group affiliation", NULL);
19581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_E_PROPS_CORRECT_3;
19582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: SPEC (6) "Circular substitution groups are disallowed.
19585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* That is, it must not be possible to return to an element declaration
19586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* by repeatedly following the {substitution group affiliation}
19587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* property."
19588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (head == elemDecl)
19590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = head;
19591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (WXS_SUBST_HEAD(head) != NULL)
19592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = xmlSchemaCheckSubstGroupCircular(head, head);
19593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
19594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    circ = NULL;
19595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (circ != NULL) {
19596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *strA = NULL, *strB = NULL;
19597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErrExt(pctxt,
19599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_E_PROPS_CORRECT_6,
19600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST circ, NULL,
19601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The element declaration '%s' defines a circular "
19602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitution group to element declaration '%s'",
19603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&strA, circ),
19604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&strB, head),
19605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
19606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(strA)
19607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(strB)
19608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_E_PROPS_CORRECT_6;
19609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (4) "If there is a {substitution group affiliation},
19612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the {type definition}
19613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the element declaration must be validly derived from the {type
19614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* definition} of the {substitution group affiliation}, given the value
19615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the {substitution group exclusions} of the {substitution group
1961660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* affiliation}, as defined in Type Derivation OK (Complex) (�3.4.6)
19617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (if the {type definition} is complex) or as defined in
1961860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Type Derivation OK (Simple) (�3.14.6) (if the {type definition} is
19619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* simple)."
19620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
19621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: {substitution group exclusions} means the values of the
19622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* attribute "final".
19623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef != WXS_ELEM_TYPEDEF(WXS_SUBST_HEAD(elemDecl))) {
19626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int set = 0;
19627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_EXTENSION)
19629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_EXTENSION;
19630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_FINAL_RESTRICTION)
19631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_RESTRICTION;
19632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST pctxt, typeDef,
19634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ELEM_TYPEDEF(head), set) != 0) {
19635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *strA = NULL, *strB = NULL, *strC = NULL;
19636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAP_E_PROPS_CORRECT_4;
19638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPCustomErrExt(pctxt,
19639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_E_PROPS_CORRECT_4,
19640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST elemDecl, NULL,
19641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition '%s' was "
19642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "either rejected by the substitution group "
19643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "affiliation '%s', or not validly derived from its type "
19644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "definition '%s'",
19645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strA, typeDef),
19646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strB, head),
19647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetComponentQName(&strC, WXS_ELEM_TYPEDEF(head)));
19648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strA)
19649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strB)
19650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(strC)
19651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (5) "If the {type definition} or {type definition}'s
19656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {content type}
19657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * is or is derived from ID then there must not be a {value constraint}.
19658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note: The use of ID as a type definition for elements goes beyond
19659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML 1.0, and should be avoided if backwards compatibility is desired"
19660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->value != NULL) &&
19662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_IS_SIMPLE(typeDef) &&
19663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlSchemaIsDerivedFromBuiltInType(typeDef, XML_SCHEMAS_ID)) ||
19664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 (WXS_IS_COMPLEX(typeDef) &&
19665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  WXS_HAS_SIMPLE_CONTENT(typeDef) &&
19666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	  xmlSchemaIsDerivedFromBuiltInType(typeDef->contentTypeDef,
19667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAS_ID)))) {
19668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAP_E_PROPS_CORRECT_5;
19670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(pctxt,
19671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_E_PROPS_CORRECT_5,
19672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST elemDecl, NULL,
19673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The type definition (or type definition's content type) is or "
19674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "is derived from ID; value constraints are not allowed in "
19675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "conjunction with such a type definition", NULL);
19676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (elemDecl->value != NULL) {
19677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int vcret;
19678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNodePtr node = NULL;
19679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "If there is a {value constraint}, the canonical lexical
1968260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of its value must be �valid� with respect to the
19683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {type definition} as defined in Element Default Valid (Immediate)
1968460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (�3.3.6)."
19685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (typeDef == NULL) {
19687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPErr(pctxt, elemDecl->node,
19688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_INTERNAL,
19689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Internal error: xmlSchemaCheckElemPropsCorrect, "
19690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type is missing... skipping validation of "
19691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the value constraint", NULL, NULL);
19692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
19693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl->node != NULL) {
19695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (elemDecl->flags & XML_SCHEMAS_ELEM_FIXED)
19696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST "fixed");
19698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
19699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = (xmlNodePtr) xmlHasProp(elemDecl->node,
19700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    BAD_CAST "default");
19701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vcret = xmlSchemaParseCheckCOSValidDefault(pctxt, node,
19703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    typeDef, elemDecl->value, &(elemDecl->defVal));
19704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vcret != 0) {
19705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vcret < 0) {
19706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaElemCheckValConstr",
19707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to validate the value constraint of an "
19708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "element declaration");
19709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
19710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (vcret);
19712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
19716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElemSubstGroup:
19720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @decl: the element declaration
19722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
19725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Substitution Group (cos-equiv-class)
19726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * In Libxml2 the subst. groups will be precomputed, in terms of that
19728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a list will be built for each subst. group head, holding all direct
19729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * referents to this head.
19730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE that this function needs:
19731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   1. circular subst. groups to be checked beforehand
19732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   2. the declaration's type to be derived from the head's type
19733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * STATUS:
19735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
19738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElemSubstGroup(xmlSchemaParserCtxtPtr ctxt,
19739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaElementPtr elemDecl)
19740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((WXS_SUBST_HEAD(elemDecl) == NULL) ||
19742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* SPEC (1) "Its {abstract} is false." */
19743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT))
19744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
19746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr head;
19747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr headType, type;
19748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int set, methSet;
19749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2) "It is validly substitutable for HEAD subject to HEAD's
19751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {disallowed substitutions} as the blocking constraint, as defined in
1975260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Substitution Group OK (Transitive) (�3.3.6)."
19753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (head = WXS_SUBST_HEAD(elemDecl); head != NULL;
19755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    head = WXS_SUBST_HEAD(head)) {
19756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    set = 0;
19757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    methSet = 0;
19758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The blocking constraints.
19760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_SUBSTITUTION)
19762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    headType = head->subtypes;
19764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = elemDecl->subtypes;
19765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (headType == type)
19766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto add_member;
19767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION)
19768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (head->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION)
19770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC: Substitution Group OK (Transitive) (2.3)
19773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "The set of all {derivation method}s involved in the
19774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derivation of D's {type definition} from C's {type definition}
19775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * does not intersect with the union of the blocking constraint,
19776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * C's {prohibited substitutions} (if C is complex, otherwise the
19777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * empty set) and the {prohibited substitutions} (respectively the
19778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * empty set) of any intermediate {type definition}s in the
19779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derivation of D's {type definition} from C's {type definition}."
19780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: Optimize this a bit, since, if traversing the
19783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * subst.head axis, the methSet does not need to be computed for
19784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the full depth over and over.
19785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The set of all {derivation method}s involved in the derivation
19788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((type != NULL) && (type != headType)) {
19790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_IS_EXTENSION(type)) &&
19791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    methSet |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_RESTRICTION(type) &&
19795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ((methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    methSet |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = type->baseType;
19799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
19801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * The {prohibited substitutions} of all intermediate types +
19802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the head's type.
19803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
19804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type = elemDecl->subtypes->baseType;
19805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (type != NULL) {
19806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_COMPLEX(type)) {
19807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((type->flags &
19808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) == 0))
19810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set |= XML_SCHEMAS_TYPE_BLOCK_EXTENSION;
19811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((type->flags &
19812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) == 0))
19814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    set |= XML_SCHEMAS_TYPE_BLOCK_RESTRICTION;
19815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
19816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type == headType)
19818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
19819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		type = type->baseType;
19820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((set != 0) &&
19822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(((set & XML_SCHEMAS_TYPE_BLOCK_EXTENSION) &&
19823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(methSet & XML_SCHEMAS_TYPE_BLOCK_EXTENSION)) ||
19824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((set & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION) &&
19825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(methSet & XML_SCHEMAS_TYPE_BLOCK_RESTRICTION)))) {
19826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
19827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
19828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectadd_member:
19829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAddElementSubstitutionMember(ctxt, head, elemDecl);
19830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((head->flags & XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD) == 0)
19831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		head->flags |= XML_SCHEMAS_ELEM_SUBST_GROUP_HEAD;
19832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef WXS_ELEM_DECL_CONS_ENABLED /* enable when finished */
19837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElementDeclComponent
19839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt: the schema parser context
19840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtComponent: the context component (an element declaration)
19841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxtParticle: the first particle of the context component
19842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @searchParticle: the element declaration particle to be analysed
19843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1984460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Schema Component Constraint: Element Declarations Consistent
19845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
19847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclConsistent(xmlSchemaParserCtxtPtr pctxt,
19848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaBasicItemPtr ctxtComponent,
1984960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				    xmlSchemaParticlePtr ctxtParticle,
19850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr searchParticle,
19851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaParticlePtr curParticle,
19852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    int search)
19853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
19855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
19857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr cur = curParticle;
1985860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (curParticle == NULL) {
19859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
19860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_PARTICLE_TERM(curParticle) == NULL) {
19862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Just return in this case. A missing "term" of the particle
19864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* might arise due to an invalid "term" component.
19865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
19866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
1986760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
19868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
19869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (WXS_PARTICLE_TERM(cur)->type) {
19870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ANY:
19871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
19873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (search == 0) {
19874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaCheckElementDeclConsistent(pctxt,
19875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxtComponent, ctxtParticle, cur, ctxtParticle, 1);
19876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
1987760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return(ret);
19878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
19879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaElementPtr elem =
19880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ELEM_CAST(WXS_PARTICLE_TERM(cur));
19881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
19882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC Element Declarations Consistent:
19883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * "If the {particles} contains, either directly,
19884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * indirectly (that is, within the {particles} of a
1988560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * contained model group, recursively) or �implicitly�
19886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * two or more element declaration particles with
19887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the same {name} and {target namespace}, then
19888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all their type definitions must be the same
19889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * top-level definition [...]"
19890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
19891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->name,
19892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->name) &&
19893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlStrEqual(WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
19894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_PARTICLE_TERM_AS_ELEM(searchParticle)->targetNamespace))
19895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    {
19896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *strA = NULL, *strB = NULL;
1989760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
19898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST pctxt,
19899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* TODO: error code */
19900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    XML_SCHEMAP_COS_NONAMBIG,
19901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    WXS_ITEM_NODE(cur), NULL,
19902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "In the content model of %s, there are multiple "
19903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "element declarations for '%s' with different "
19904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "type definitions",
19905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaGetComponentDesignation(&strA,
19906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ctxtComponent),
19907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaFormatQName(&strB,
19908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_PARTICLE_TERM_AS_ELEM(cur)->targetNamespace,
19909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				WXS_PARTICLE_TERM_AS_ELEM(cur)->name));
19910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strA);
19911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			FREE_AND_NULL(strB);
19912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(XML_SCHEMAP_COS_NONAMBIG);
19913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
1991460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
19915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
1991660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_SEQUENCE: {
19917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:{
19920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
19921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaTreeItemPtr sub;
1992260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
1992360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		sub = WXS_PARTICLE_TERM(particle)->children;  (xmlSchemaParticlePtr)
19924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (sub != NULL) {
19925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaCheckElementDeclConsistent(pctxt, ctxtComponent,
19926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxtParticle, ctxtElem);
19927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret != 0)
19928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(ret);
19929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sub = sub->next;
19930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
19932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
19934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
19935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
19937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
19938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
19939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaInternalErr2(ACTXT_CAST pctxt,
19940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaCheckElementDeclConsistent",
19941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "found unexpected term of type '%s' in content model",
19942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ITEM_TYPE_NAME(WXS_PARTICLE_TERM(cur)), NULL);
19943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
19944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
19945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = (xmlSchemaParticlePtr) cur->next;
19946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
19949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
19950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
19952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckElementDeclComponent
19955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an schema element declaration/particle
19956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
19957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute
19958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validates the value constraints of an element declaration.
1996060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Adds substitution group members.
19961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
19963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl,
19964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt)
19965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl == NULL)
19967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED)
19969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
19970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    elemDecl->flags |= XML_SCHEMAS_ELEM_INTERNAL_CHECKED;
19971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaCheckElemPropsCorrect(ctxt, elemDecl) == 0) {
19972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
19973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Adds substitution group members.
19974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
1997560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaCheckElemSubstGroup(ctxt, elemDecl);
19976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
19977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
19978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
19980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveModelGroupParticleReferences:
19981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @particle:  a particle component
19982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
19983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
19984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves references of a model group's {particles} to
19985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * model group definitions and to element declarations.
19986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
19987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
19988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveModelGroupParticleReferences(
19989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr ctxt,
19990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaModelGroupPtr mg)
19991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
19992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParticlePtr particle = WXS_MODELGROUP_PARTICLE(mg);
19993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaQNameRefPtr ref;
19994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr refItem;
19995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
19997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: Test this.
19998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
19999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (particle != NULL) {
20000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((WXS_PARTICLE_TERM(particle) == NULL) ||
20001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((WXS_PARTICLE_TERM(particle))->type !=
20002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_EXTRA_QNAMEREF))
20003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_particle;
2000560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ref = WXS_QNAME_CAST WXS_PARTICLE_TERM(particle);
20007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Resolve the reference.
20009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NULL the {term} by default.
20010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle->children = NULL;
20012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	refItem = xmlSchemaGetNamedComponent(ctxt->schema,
20014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->itemType, ref->name, ref->targetNamespace);
20015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refItem == NULL) {
20016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt, XML_SCHEMAP_SRC_RESOLVE,
20017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_ITEM_NODE(particle), "ref", ref->name,
20018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ref->targetNamespace, ref->itemType, NULL);
20019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* TODO: remove the particle. */
20020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_particle;
2002160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (refItem->type == XML_SCHEMA_TYPE_GROUP) {
20023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_MODELGROUPDEF_MODEL(refItem) == NULL)
20024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: remove the particle. */
20025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_particle;
20026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE that we will assign the model group definition
20028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * itself to the "term" of the particle. This will ease
20029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the check for circular model group definitions. After
20030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * that the "term" will be assigned the model group of the
20031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * model group definition.
20032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((WXS_MODELGROUPDEF_MODEL(refItem))->type ==
20034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ALL) {
20035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1)
20037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC cos-all-limited (1.2)
20038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "It appears only as the value of one or both of the
20039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* following properties:"
20040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.1) "the {model group} property of a model group
20041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*        definition."
20042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (1.2) "the {term} property of a particle [... of] the "
20043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {content type} of a complex type definition."
20044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST ctxt,
20046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* TODO: error code */
20047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_COS_ALL_LIMITED,
20048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ITEM_NODE(particle), NULL,
20049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "A model group definition is referenced, but "
20050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "it contains an 'all' model group, which "
20051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "cannot be contained by model groups",
20052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL);
20053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: remove the particle. */
20054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto next_particle;
20055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->children = (xmlSchemaTreeItemPtr) refItem;
20057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Are referenced element declarations the only
20060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * other components we expect here?
20061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    particle->children = (xmlSchemaTreeItemPtr) refItem;
20063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_particle:
20065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	particle = WXS_PTC_CAST particle->next;
20066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAreValuesEqual(xmlSchemaValPtr x,
2007160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		       xmlSchemaValPtr y)
2007260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2007360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypePtr tx, ty, ptx, pty;
20074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
20075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (x != NULL) {
20077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Same types. */
20078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tx = xmlSchemaGetBuiltInType(xmlSchemaGetValType(x));
20079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ty = xmlSchemaGetBuiltInType(xmlSchemaGetValType(y));
20080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ptx = xmlSchemaGetPrimitiveType(tx);
20081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pty = xmlSchemaGetPrimitiveType(ty);
20082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2008360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (1) if a datatype T' is �derived� by �restriction� from an
2008460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* atomic datatype T then the �value space� of T' is a subset of
2008560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* the �value space� of T. */
20086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2008760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (2) if datatypes T' and T'' are �derived� by �restriction�
2008860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* from a common atomic ancestor T then the �value space�s of T'
20089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and T'' may overlap.
20090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ptx != pty)
20092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(0);
20093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We assume computed values to be normalized, so do a fast
20095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* string comparison for string based types.
20096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ptx->builtInType == XML_SCHEMAS_STRING) ||
20098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_IS_ANY_SIMPLE_TYPE(ptx)) {
20099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! xmlStrEqual(
20100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValueGetAsString(x),
20101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaValueGetAsString(y)))
20102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (0);
20103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCompareValuesWhtsp(
20105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		x, XML_SCHEMA_WHITESPACE_PRESERVE,
20106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		y, XML_SCHEMA_WHITESPACE_PRESERVE);
20107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -2)
20108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
20110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(0);
20111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Lists.
20114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	x = xmlSchemaValueGetNext(x);
20116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (x != NULL) {
20117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    y = xmlSchemaValueGetNext(y);
20118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (y == NULL)
2011960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return (0);
20120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlSchemaValueGetNext(y) != NULL)
20121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
20122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
20123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (1);
20124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
20126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrUseReferences:
20130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an attribute use
20131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
20132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the referenced attribute declaration.
20134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrUseReferences(xmlSchemaAttributeUsePtr ause,
20137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlSchemaParserCtxtPtr ctxt)
20138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ause == NULL))
20140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ause->attrDecl == NULL) ||
20142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(ause->attrDecl->type != XML_SCHEMA_EXTRA_QNAMEREF))
20143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
20144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaQNameRefPtr ref = WXS_QNAME_CAST ause->attrDecl;
20147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Evaluate, what errors could occur if the declaration is not
20150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* found.
20151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ause->attrDecl = xmlSchemaGetAttributeDecl(ctxt->schema,
20153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ref->name, ref->targetNamespace);
20154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ause->attrDecl == NULL) {
20155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
20156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    	XML_SCHEMAP_SRC_RESOLVE,
20157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST ause, ause->node,
20158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"ref", ref->name, ref->targetNamespace,
20159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
20160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(ctxt->err);;
20161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
20162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckAttrUsePropsCorrect:
20168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a parser context
2016960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @use:  an attribute use
20170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
20172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Attribute Use Correct (au-props-correct)
2017360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
20174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckAttrUsePropsCorrect(xmlSchemaParserCtxtPtr ctxt,
20177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaAttributeUsePtr use)
20178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (use == NULL))
20180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((use->defValue == NULL) || (WXS_ATTRUSE_DECL(use) == NULL) ||
20182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_ATTRUSE_DECL(use))->type != XML_SCHEMA_TYPE_ATTRIBUTE))
2018360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC au-props-correct (1)
20187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The values of the properties of an attribute use must be as
20188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * described in the property tableau in The Attribute Use Schema
2018960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Component (�3.5.1), modulo the impact of Missing
2019060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3)."
20191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2019260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((WXS_ATTRUSE_DECL(use))->defValue != NULL) &&
20194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMAS_ATTR_FIXED) &&
20195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((use->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPCustomErr(ctxt,
20198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_AU_PROPS_CORRECT_2,
20199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_BASIC_CAST use, NULL,
20200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The attribute declaration has a 'fixed' value constraint "
20201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ", thus the attribute use must also have a 'fixed' value "
20202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "constraint",
20203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
20204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
20205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Compute and check the value constraint's value.
20208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((use->defVal != NULL) && (WXS_ATTRUSE_TYPEDEF(use) != NULL)) {
20210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
20211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2021260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* TODO: The spec seems to be missing a check of the
20213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* value constraint of the attribute use. We will do it here.
20214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC a-props-correct (3)
20217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIsDerivedFromBuiltInType(
20219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ATTRUSE_TYPEDEF(use), XML_SCHEMAS_ID))
20220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
20222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT,
20223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST use,
20224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Value constraints are not allowed if the type definition "
20225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"is or is derived from xs:ID",
20226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2022960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST ctxt,
20231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->node, WXS_ATTRUSE_TYPEDEF(use),
20232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    use->defValue, &(use->defVal),
20233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    1, 1, 0);
20234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
20235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
20236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT2("xmlSchemaCheckAttrUsePropsCorrect",
20237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
20238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt,
20241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT,
20242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST use,
20243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The value of the value constraint is not valid",
20244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC au-props-correct (2)
20250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "If the {attribute declaration} has a fixed
20251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {value constraint}, then if the attribute use itself has a
20252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * {value constraint}, it must also be fixed and its value must match
20253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * that of the {attribute declaration}'s {value constraint}."
20254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((WXS_ATTRUSE_DECL(use))->defVal != NULL) &&
20256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(((WXS_ATTRUSE_DECL(use))->flags & XML_SCHEMA_ATTR_USE_FIXED) == 0))
20257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
20258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! xmlSchemaAreValuesEqual(use->defVal,
20259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTRUSE_DECL(use))->defVal))
20260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
20261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPCustomErr(ctxt,
20262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_AU_PROPS_CORRECT_2,
20263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST use, NULL,
20264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The 'fixed' value constraint of the attribute use "
20265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must match the attribute declaration's value "
20266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"constraint '%s'",
20267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTRUSE_DECL(use))->defValue);
20268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->err);
20270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveAttrTypeReferences:
20279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item:  an attribute declaration
2028060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt:  a parser context
20281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolves the referenced type definition component.
20283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrTypeReferences(xmlSchemaAttributePtr item,
20286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlSchemaParserCtxtPtr ctxt)
20287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The simple type definition corresponding to the <simpleType> element
20290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * information item in the [children], if present, otherwise the simple
2029160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * type definition �resolved� to by the �actual value� of the type
2029260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * [attribute], if present, otherwise the �simple ur-type definition�.
20293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->flags & XML_SCHEMAS_ATTR_INTERNAL_RESOLVED)
20295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
20296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    item->flags |= XML_SCHEMAS_ATTR_INTERNAL_RESOLVED;
20297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->subtypes != NULL)
20298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
20299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (item->typeName != NULL) {
20300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaTypePtr type;
20301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	type = xmlSchemaGetType(ctxt->schema, item->typeName,
20303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->typeNs);
20304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type == NULL) || (! WXS_IS_SIMPLE(type))) {
20305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(ctxt,
20306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
20307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST item, item->node,
20308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"type", item->typeName, item->typeNs,
20309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_SIMPLE, NULL);
20310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ctxt->err);
20311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
20312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item->subtypes = type;
20313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
20315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The type defaults to the xs:anySimpleType.
20317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item->subtypes = xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYSIMPLETYPE);
20319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
20324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaResolveIDCKeyReferences:
20325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idc:  the identity-constraint definition
20326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
20327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the attribute name
20328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
20329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Resolve keyRef references to key/unique IDCs.
20330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schema Component Constraint:
20331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   Identity-constraint Definition Properties Correct (c-props-correct)
20332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
20333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveIDCKeyReferences(xmlSchemaIDCPtr idc,
20335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaParserCtxtPtr pctxt)
20336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF)
20338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
20339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc->ref->name != NULL) {
20340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idc->ref->item = (xmlSchemaBasicItemPtr)
20341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetIDC(pctxt->schema, idc->ref->name,
20342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idc->ref->targetNamespace);
20343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (idc->ref->item == NULL) {
20344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: It is actually not an error to fail to resolve
20346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * at this stage. BUT we need to be that strict!
20347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPResCompAttrErr(pctxt,
20349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_RESOLVE,
20350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST idc, idc->node,
20351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"refer", idc->ref->name,
20352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idc->ref->targetNamespace,
20353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_TYPE_IDC_KEY, NULL);
20354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return(pctxt->err);
20355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (idc->ref->item->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
20356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC c-props-correct (1)
20358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_C_PROPS_CORRECT,
20361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, WXS_BASIC_CAST idc,
20362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The keyref references a keyref",
20363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL);
20364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc->ref->item = NULL;
20365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(pctxt->err);
20366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
20367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (idc->nbFields !=
20368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((xmlSchemaIDCPtr) idc->ref->item)->nbFields) {
20369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
20370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaIDCPtr refer;
2037160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		refer = (xmlSchemaIDCPtr) idc->ref->item;
20373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC c-props-correct(2)
20375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "If the {identity-constraint category} is keyref,
20376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the cardinality of the {fields} must equal that of
20377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the {fields} of the {referenced key}.
20378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST pctxt,
20380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAP_C_PROPS_CORRECT,
20381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, WXS_BASIC_CAST idc,
20382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The cardinality of the keyref differs from the "
20383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "cardinality of the referenced key/unique '%s'",
20384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str, refer->targetNamespace,
20385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			refer->name),
20386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
20387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str)
20388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(pctxt->err);
20389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaResolveAttrUseProhibReferences(xmlSchemaAttributeUseProhibPtr prohib,
20397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       xmlSchemaParserCtxtPtr pctxt)
20398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaGetAttributeDecl(pctxt->schema, prohib->name,
20400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prohib->targetNamespace) == NULL) {
20401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPResCompAttrErr(pctxt,
20403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAP_SRC_RESOLVE,
20404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, prohib->node,
20405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "ref", prohib->name, prohib->targetNamespace,
20406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_TYPE_ATTRIBUTE, NULL);
20407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(XML_SCHEMAP_SRC_RESOLVE);
20408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_TYPE(c) \
20413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaTypePtr) item)->flags & XML_SCHEMAS_TYPE_REDEFINED)
20414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_MODEL_GROUP_DEF(c) \
20416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaModelGroupDefPtr) item)->flags & XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_REDEFINED_ATTR_GROUP(c) \
20419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project(((xmlSchemaAttributeGroupPtr) item)->flags & XML_SCHEMAS_ATTRGROUP_REDEFINED)
20420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCRedefineFirst(xmlSchemaParserCtxtPtr pctxt)
20423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err = 0;
20425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr prev, item;
20427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int wasRedefined;
20428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (redef == NULL)
2043060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
20433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = redef->item;
20434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* First try to locate the redefined component in the
20436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* schema graph starting with the redefined schema.
20437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: According to this schema bug entry:
20438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005OctDec/0019.html
20439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   it's not clear if the referenced component needs to originate
20440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   from the <redefine>d schema _document_ or the schema; the latter
20441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   would include all imported and included sub-schemas of the
20442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   <redefine>d schema. Currenlty we latter approach is used.
20443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   SUPPLEMENT: It seems that the WG moves towards the latter
20444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   approach, so we are doing it right.
2044560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*
20446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = xmlSchemaFindRedefCompInGraph(
20448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef->targetBucket, item->type,
20449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef->refName, redef->refTargetNs);
20450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prev == NULL) {
20451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
20452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node;
20453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
20455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC src-redefine:
2045660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (6.2.1) "The �actual value� of its own name attribute plus
2045760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * target namespace must successfully �resolve� to a model
20458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * group definition in I."
2045960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (7.2.1) "The �actual value� of its own name attribute plus
2046060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * target namespace must successfully �resolve� to an attribute
20461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * group definition in I."
20462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
20464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that, if we are redefining with the use of references
20465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to components, the spec assumes the src-resolve to be used;
20466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * but this won't assure that we search only *inside* the
20467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * redefined schema.
20468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
20469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (redef->reference)
20470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->reference);
20471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
20472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(item);
20473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: error code.
20476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Probably XML_SCHEMAP_SRC_RESOLVE, if this is using the
2047760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* reference kind.
20478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE, node, NULL,
20480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The %s '%s' to be redefined could not be found in "
20481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the redefined schema",
20482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(item),
20483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, redef->refTargetNs,
20484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->refName));
2048560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str);
20486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = pctxt->err;
20487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Obtaining and setting the redefinition state is really
20492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* clumsy.
20493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	wasRedefined = 0;
20495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_TYPE_CAST prev)->flags &
20499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_REDEFINED)
20500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Mark it as redefined. */
20505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_TYPE_CAST prev)->flags |= XML_SCHEMAS_TYPE_REDEFINED;
20506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Assign the redefined type to the
20508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* base type of the redefining type.
20509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: How
20510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2051160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		((xmlSchemaTypePtr) item)->baseType =
20512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) prev;
20513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_MODEL_GROUPDEF_CAST prev)->flags &
20516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED)
20517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Mark it as redefined. */
20522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_MODEL_GROUPDEF_CAST prev)->flags |=
20523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_MODEL_GROUP_DEF_REDEFINED;
20524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (redef->reference != NULL) {
20525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Overwrite the QName-reference with the
20527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * referenced model group def.
20528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_PTC_CAST redef->reference)->children =
20530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_TREE_CAST prev;
20531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		redef->target = prev;
20533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ATTR_GROUP_CAST prev)->flags &
20536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ATTRGROUP_REDEFINED)
20537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    wasRedefined = 1;
20539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
20540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_ATTR_GROUP_CAST prev)->flags |=
20542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ATTRGROUP_REDEFINED;
20543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (redef->reference != NULL) {
20544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Assign the redefined attribute group to the
20546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * QName-reference component.
20547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the easy case, since we will just
20548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * expand the redefined group.
20549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_QNAME_CAST redef->reference)->item = prev;
20551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->target = NULL;
20552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
20553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
20554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * This is the complicated case: we need
20555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * to apply src-redefine (7.2.2) at a later
20556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * stage, i.e. when attribute group references
20557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * have beed expanded and simple types have
20558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * beed fixed.
20559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
20560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    redef->target = prev;
20561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaResolveRedefReferences",
20565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Unexpected redefined component type");
2056660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		return(-1);
20567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (wasRedefined) {
20569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
20570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr node;
20571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (redef->reference)
20573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->reference);
20574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
20575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = WXS_ITEM_NODE(redef->item);
2057660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* TODO: error code. */
20579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_SRC_REDEFINE,
20580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node, NULL,
20581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The referenced %s was already redefined. Multiple "
20582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"redefinition of the same component is not supported",
20583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentDesignation(&str, prev),
20584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL);
2058560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str)
20586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    err = pctxt->err;
20587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2059060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	redef = redef->next;
20591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (redef != NULL);
20592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(err);
20594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckSRCRedefineSecond(xmlSchemaParserCtxtPtr pctxt)
20598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err = 0;
20600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaRedefPtr redef = WXS_CONSTRUCTOR(pctxt)->redefs;
20601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item;
20602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (redef == NULL)
2060460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
20607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (redef->target == NULL) {
20608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    redef = redef->next;
20609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
20610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = redef->item;
2061260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Since the spec wants the {name} of the redefined
20618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* type to be 'absent', we'll NULL it.
20619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(WXS_TYPE_CAST redef->target)->name = NULL;
2062160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* TODO: Seems like there's nothing more to do. The normal
20624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* inheritance mechanism is used. But not 100% sure.
20625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* URGENT TODO:
20630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC src-redefine:
20631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (6.2.2) "The {model group} of the model group definition
20632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* which corresponds to it per XML Representation of Model
2063360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Group Definition Schema Components (�3.7.2) must be a
2063460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �valid restriction� of the {model group} of that model
20635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* group definition in I, as defined in Particle Valid
2063660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (Restriction) (�3.9.6)."
20637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC src-redefine:
20642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* (7.2.2) "The {attribute uses} and {attribute wildcard} of
20643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the attribute group definition which corresponds to it
20644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* per XML Representation of Attribute Group Definition Schema
2064560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* Components (�3.6.2) must be �valid restrictions� of the
20646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* {attribute uses} and {attribute wildcard} of that attribute
20647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* group definition in I, as defined in clause 2, clause 3 and
20648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* clause 4 of Derivation Valid (Restriction, Complex)
2064960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* (�3.4.6) (where references to the base type definition are
20650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* understood as references to the attribute group definition
20651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* in I)."
20652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		err = xmlSchemaCheckDerivationOKRestriction2to4(pctxt,
20654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ACTION_REDEFINE,
20655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    item, redef->target,
20656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST item)->attrUses,
20657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST redef->target)->attrUses,
20658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST item)->attributeWildcard,
20659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_ATTR_GROUP_CAST redef->target)->attributeWildcard);
20660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (err == -1)
20661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
20662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	redef = redef->next;
20667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (redef != NULL);
20668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2067060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAddComponents(xmlSchemaParserCtxtPtr pctxt,
20674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaBucketPtr bucket)
20675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBasicItemPtr item;
20677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int err;
20678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr *table;
20679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *name;
20680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
20681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define WXS_GET_GLOBAL_HASH(c, slot) { \
20683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_BUCKET_IMPMAIN((c)->type)) \
20684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = &(WXS_IMPBUCKET((c))->schema->slot); \
20685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else \
20686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = &(WXS_INCBUCKET((c))->ownerImport->schema->slot); }
20687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add global components to the schema's hash tables.
20690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This is the place where duplicate components will be
20691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * detected.
20692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: I think normally we should support imports of the
20693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   same namespace from multiple locations. We don't do currently,
20694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   but if we do then according to:
20695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2224
20696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   we would need, if imported directly, to import redefined
20697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   components as well to be able to catch clashing components.
20698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   (I hope I'll still know what this means after some months :-()
20699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL)
20701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
20702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED)
20703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
2070460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    bucket->flags |= XML_SCHEMA_BUCKET_COMPS_ADDED;
2070560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < bucket->globals->nbItems; i++) {
20707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = bucket->globals->items[i];
20708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	table = NULL;
20709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_TYPE(item))
20713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_TYPE_CAST item)->name;
20715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, typeDecl)
20716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
20718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ELEM_CAST item)->name;
20719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, elemDecl)
20720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE:
20722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ATTR_CAST item)->name;
20723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, attrDecl)
20724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_MODEL_GROUP_DEF(item))
20727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_MODEL_GROUPDEF_CAST item)->name;
20729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, groupDecl)
20730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_REDEFINED_ATTR_GROUP(item))
20733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
20734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_ATTR_GROUP_CAST item)->name;
20735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, attrgrpDecl)
20736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEY:
20738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
20739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEYREF:
20740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = (WXS_IDC_CAST item)->name;
20741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, idcDef)
20742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_NOTATION:
20744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		name = ((xmlSchemaNotationPtr) item)->name;
20745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_GET_GLOBAL_HASH(bucket, notaDecl)
2074660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
20747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaAddComponents",
20749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Unexpected global component type");
2075060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		continue;
2075160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*table == NULL) {
20753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *table = xmlHashCreateDict(10, pctxt->dict);
20754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*table == NULL) {
20755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		PERROR_INT("xmlSchemaAddComponents",
20756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "failed to create a component hash table");
20757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
20758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2075960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	err = xmlHashAddEntry(*table, name, item);
2076160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (err != 0) {
20762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
2076360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST pctxt,
20765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAP_REDEFINED_TYPE,
20766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_NODE(item),
20767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST item,
20768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"A global %s '%s' does already exist",
20769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_ITEM_TYPE_NAME(item),
20770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetComponentQName(&str, item));
2077160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    FREE_AND_NULL(str);
20772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process imported/included schemas.
20776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket->relations != NULL) {
20778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSchemaRelationPtr rel = bucket->relations;
20779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
20780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((rel->bucket != NULL) &&
20781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((rel->bucket->flags & XML_SCHEMA_BUCKET_COMPS_ADDED) == 0)) {
20782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaAddComponents(pctxt, rel->bucket) == -1)
20783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return(-1);
20784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
20785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    rel = rel->next;
20786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (rel != NULL);
20787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
20789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
20790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
20792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFixupComponents(xmlSchemaParserCtxtPtr pctxt,
20793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaBucketPtr rootBucket)
20794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
20795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaConstructionCtxtPtr con = pctxt->constructor;
20796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTreeItemPtr item, *items;
20797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbItems, i, ret = 0;
20798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr oldbucket = con->bucket;
20799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl;
20800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FIXHFAILURE if (pctxt->err == XML_SCHEMAP_INTERNAL) goto exit_failure;
20802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((con->pending == NULL) ||
20804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(con->pending->nbItems == 0))
2080560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(0);
20806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Since xmlSchemaFixupComplexType() will create new particles
20809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (local components), and those particle components need a bucket
20810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * on the constructor, we'll assure here that the constructor has
20811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a bucket.
2081260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * TODO: Think about storing locals _only_ on the main bucket.
2081360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->bucket == NULL)
2081560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	con->bucket = rootBucket;
20816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO:
20818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (src-redefine):
20819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (6.2) "If it has no such self-reference, then all of the
20820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * following must be true:"
2082160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (6.2.2) The {model group} of the model group definition which
20823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * corresponds to it per XML Representation of Model Group
2082460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Definition Schema Components (�3.7.2) must be a �valid
2082560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * restriction� of the {model group} of that model group definition
2082660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * in I, as defined in Particle Valid (Restriction) (�3.9.6)."
20827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCheckSRCRedefineFirst(pctxt);
20829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add global components to the schemata's hash tables.
2083260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAddComponents(pctxt, rootBucket);
20834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
20835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->ctxtType = NULL;
20836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    items = (xmlSchemaTreeItemPtr *) con->pending->items;
20837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nbItems = con->pending->nbItems;
20838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now that we have parsed *all* the schema document(s) and converted
20840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * them to schema components, we can resolve references, apply component
20841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * constraints, create the FSA from the content model, etc.
2084260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Resolve references of..
20845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
20846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1. element declarations:
20847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the type definition
20848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the substitution group affiliation
20849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2. simple/complex types:
20850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the base type definition
20851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the memberTypes of union types
20852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the itemType of list types
20853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3. attributes declarations and attribute uses:
20854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the type definition
20855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - if an attribute use, then the attribute declaration
20856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 4. attribute group references:
20857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the attribute group definition
20858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 5. particles:
20859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the term of the particle (e.g. a model group)
20860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 6. IDC key-references:
20861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   - the referenced IDC 'key' or 'unique' definition
20862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 7. Attribute prohibitions which had a "ref" attribute.
2086360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
20864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
20868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveElementReferences(
20869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaElementPtr) item, pctxt);
20870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveTypeReferences(
20875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) item, pctxt);
20876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE:
20879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrTypeReferences(
20880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributePtr) item, pctxt);
20881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
20884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrUseReferences(
20885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeUsePtr) item, pctxt);
20886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_EXTRA_QNAMEREF:
2088960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((WXS_QNAME_CAST item)->itemType ==
20890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_TYPE_ATTRIBUTEGROUP)
20891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
20892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaResolveAttrGroupReferences(
20893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_QNAME_CAST item, pctxt);
20894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
20895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
20898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_CHOICE:
20899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ALL:
20900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveModelGroupParticleReferences(pctxt,
20901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_MODEL_GROUP_CAST item);
20902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEY:
20905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_UNIQUE:
20906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_IDC_KEYREF:
20907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveIDCKeyReferences(
20908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaIDCPtr) item, pctxt);
20909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB:
20912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
20913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle attribue prohibition which had a
20914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "ref" attribute.
20915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
20916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaResolveAttrUseProhibReferences(
20917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTR_PROHIB_CAST item, pctxt);
20918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
20925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2092660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
20927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Now that all references are resolved we
20929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * can check for circularity of...
2093060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 1. the base axis of type definitions
20931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2. nested model group definitions
20932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3. nested attribute group definitions
20933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: check for circual substitution groups.
20934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
20938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Let's better stop on the first error here.
20939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
20940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
20942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SIMPLE:
20943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckTypeDefCircular(
20944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaTypePtr) item, pctxt);
20945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_GROUP:
20950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckGroupDefCircular(
20951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaModelGroupDefPtr) item, pctxt);
20952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAttrGroupCircular(
20958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaAttributeGroupPtr) item, pctxt);
20959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
20960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (pctxt->nberrors != 0)
20961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto exit_error;
20962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2096560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
20966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
20968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
20969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Model group definition references:
20971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Such a reference is reflected by a particle at the component
20972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * level. Until now the 'term' of such particles pointed
20973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to the model group definition; this was done, in order to
20974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * ease circularity checks. Now we need to set the 'term' of
20975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * such particles to the model group of the model group definition.
20976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_SEQUENCE:
2098160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_CHOICE:
20982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaModelGroupToModelGroupDefFixup(pctxt,
20983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_MODEL_GROUP_CAST item);
20984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
20986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
20987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
20988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
20989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
20990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
20991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
20992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Expand attribute group references of attribute group definitions.
20993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
20994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
20995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
20996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
20997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
20998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((! WXS_ATTR_GROUP_EXPANDED(item)) &&
20999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_ATTR_GROUP_HAS_REFS(item))
21000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaAttributeGroupExpandRefs(pctxt,
21002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTR_GROUP_CAST item);
21003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2101260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * First compute the variety of simple types. This is needed as
21014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * a seperate step, since otherwise we won't be able to detect
21015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * circular union types in all cases.
21016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED_1((xmlSchemaTypePtr) item)) {
21022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupSimpleTypeStageOne(pctxt,
21023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) item);
21024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Detect circular union types. Note that this needs the variety to
21035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * be already computed.
21036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((xmlSchemaTypePtr) item)->memberTypes != NULL) {
2104260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCheckUnionTypeDefCircular(pctxt,
21043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) item);
21044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2105360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Do the complete type fixup for simple types.
21056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_SCHEMA_TYPE_SIMPLE:
21061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
21062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupSimpleTypeStageTwo(pctxt, WXS_TYPE_CAST item);
21063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * At this point we need build and check all simple types.
21074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply contraints for attribute declarations.
21077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
2108160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_TYPE_ATTRIBUTE:
21082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAttrPropsCorrect(pctxt, WXS_ATTR_CAST item);
21083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
2108460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		break;
21085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for attribute uses.
2109360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
21094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ATTRIBUTE_USE:
21098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (((xmlSchemaAttributeUsePtr)item)->defValue != NULL) {
21099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckAttrUsePropsCorrect(pctxt,
21100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_ATTR_USE_CAST item);
21101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for attribute group definitions.
21113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_TYPE_ATTRIBUTEGROUP:
21118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (( (WXS_ATTR_GROUP_CAST item)->attrUses != NULL) &&
21119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		( (WXS_LIST_CAST (WXS_ATTR_GROUP_CAST item)->attrUses)->nbItems > 1))
21120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
21121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCheckAGPropsCorrect(pctxt, WXS_ATTR_GROUP_CAST item);
21122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FIXHFAILURE;
21123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
21126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply constraints for redefinitions.
21134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_CONSTRUCTOR(pctxt)->redefs != NULL)
21136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCheckSRCRedefineSecond(pctxt);
21137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2114060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Complex types are builded and checked.
21142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = con->pending->items[i];
21145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
21147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_IS_TYPE_NOT_FIXED(WXS_TYPE_CAST item)) {
21148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFixupComplexType(pctxt, WXS_TYPE_CAST item);
21149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The list could have changed, since xmlSchemaFixupComplexType()
21161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * will create particles and model groups in some cases.
21162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    items = (xmlSchemaTreeItemPtr *) con->pending->items;
2116460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    nbItems = con->pending->nbItems;
2116560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Apply some constraints for element declarations.
21168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_ELEMENT:
21173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl = (xmlSchemaElementPtr) item;
2117460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((elemDecl->flags & XML_SCHEMAS_ELEM_INTERNAL_CHECKED) == 0)
21176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckElementDeclComponent(
21178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaElementPtr) elemDecl, pctxt);
21179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FIXHFAILURE;
21180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef WXS_ELEM_DECL_CONS_ENABLED
21183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
21184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Schema Component Constraint: Element Declarations Consistent
21185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Apply this constraint to local types of element declarations.
21186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
21187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((WXS_ELEM_TYPEDEF(elemDecl) != NULL) &&
21188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_IS_COMPLEX(WXS_ELEM_TYPEDEF(elemDecl))) &&
21189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (WXS_TYPE_IS_LOCAL(WXS_ELEM_TYPEDEF(elemDecl))))
21190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		{
21191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCheckElementDeclConsistent(pctxt,
21192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST elemDecl,
21193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_TYPE_PARTICLE(WXS_ELEM_TYPEDEF(elemDecl)),
21194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, NULL, 0);
21195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
21197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
2120460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Finally we can build the automaton from the content model of
21207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * complex types.
21208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbItems; i++) {
21211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	item = items[i];
21212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (item->type) {
21213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_TYPE_COMPLEX:
21214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaBuildContentModel((xmlSchemaTypePtr) item, pctxt);
21215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* FIXHFAILURE; */
21216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
21218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->nberrors != 0)
21222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_error;
21223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: cos-element-consistent
2122560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
2122660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    goto exit;
21227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2122860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottexit_error:
21229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = pctxt->err;
21230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto exit;
21231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
21233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = -1;
21234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
21236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the constructor. This is needed for XSI acquisition, since
21238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * those items will be processed over and over again for every XSI
21239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if not cleared here.
21240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    con->bucket = oldbucket;
2124260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    con->pending->nbItems = 0;
21243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->substGroups != NULL) {
21244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlHashFree(con->substGroups,
21245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashDeallocator) xmlSchemaSubstGroupFree);
21246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	con->substGroups = NULL;
2124760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
21248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (con->redefs != NULL) {
21249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaRedefListFree(con->redefs);
21250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	con->redefs = NULL;
21251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
21253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaParse:
21256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
21257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal
21259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances.
21260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML Schema structure built from the resource or
21262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
21263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPtr
21265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaParse(xmlSchemaParserCtxtPtr ctxt)
21266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPtr mainSchema = NULL;
21268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
21269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
21270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This one is used if the schema to be parsed was specified via
21273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the API; i.e. not automatically by the validated instance document.
21274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaInitTypes();
21277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
21280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Init the context. Is this all we need?*/
21282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->nberrors = 0;
21283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->err = 0;
21284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->counter = 0;
21285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Create the *main* schema. */
21287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema = xmlSchemaNewSchema(ctxt);
21288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mainSchema == NULL)
21289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create the schema constructor.
21292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->constructor == NULL) {
21294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = xmlSchemaConstructionCtxtCreate(ctxt->dict);
21295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->constructor == NULL)
21296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(NULL);
21297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Take ownership of the constructor to be able to free it. */
21298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 1;
21299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->constructor->mainSchema = mainSchema;
21301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Locate and add the schema document.
21303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaAddSchemaDoc(ctxt, XML_SCHEMA_SCHEMA_MAIN,
21305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->URL, ctxt->doc, ctxt->buffer, ctxt->size, NULL,
21306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NULL, NULL, &bucket);
21307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res == -1)
21308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0)
2131060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	goto exit;
21311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bucket == NULL) {
21313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: Error code, actually we failed to *locate* the schema. */
2131460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (ctxt->URL)
21315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
21316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
21317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to locate the main schema resource at '%s'",
21318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ctxt->URL, NULL);
21319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
21320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST ctxt, XML_SCHEMAP_FAILED_LOAD,
21321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, NULL,
21322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Failed to locate the main schema resource",
21323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL, NULL);
21324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2132560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
21326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Then do the parsing for good. */
21327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaParseNewDocWithContext(ctxt, mainSchema, bucket) == -1)
21328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nberrors != 0)
21330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2133160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema->doc = bucket->doc;
21333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    mainSchema->preserve = ctxt->preserve;
2133460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = mainSchema;
21336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaFixupComponents(ctxt, WXS_CONSTRUCTOR(ctxt)->mainBucket) == -1)
21338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: This is not nice, since we cannot distinguish from the
21342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * result if there was an internal error or not.
21343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2134460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottexit:
2134560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt->nberrors != 0) {
21346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (mainSchema) {
21347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(mainSchema);
21348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    mainSchema = NULL;
21349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->constructor) {
21351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaConstructionCtxtFree(ctxt->constructor);
21352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->constructor = NULL;
21353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ctxt->ownsConstructor = 0;
21354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = NULL;
21357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(mainSchema);
21358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
2135960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
21360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Quite verbose, but should catch internal errors, which were
21361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * not communitated.
21362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (mainSchema) {
21364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFree(mainSchema);
21365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	mainSchema = NULL;
21366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->constructor) {
21368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaConstructionCtxtFree(ctxt->constructor);
21369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->constructor = NULL;
21370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->ownsConstructor = 0;
21371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    PERROR_INT2("xmlSchemaParse",
2137360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	"An internal error occured");
21374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->schema = NULL;
21375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
21376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetParserErrors:
21380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
21381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback
21382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback
21383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
21384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context
21386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
21388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlSchemaValidityErrorFunc err,
21390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlSchemaValidityWarningFunc warn, void *ctx)
21391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
21394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
21395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
21396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
21397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL)
21398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidErrors(ctxt->vctxt, err, warn, ctx);
21399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetParserStructuredErrors:
21403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema parser context
21404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
21405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
21406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
21408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
21410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
21411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   xmlStructuredErrorFunc serror,
21412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   void *ctx)
21413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
21415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
21416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
21417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
21418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->vctxt != NULL)
21419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetValidStructuredErrors(ctxt->vctxt, serror, ctx);
21420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetParserErrors:
21424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a XMl-Schema parser context
21425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error callback result
21426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning callback result
21427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: contextual data for the callbacks result
21428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a parser context
21430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise
21432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
21434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
21435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaValidityErrorFunc * err,
21436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 xmlSchemaValidityWarningFunc * warn, void **ctx)
21437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt == NULL)
21439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
21440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err != NULL)
21441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*err = ctxt->error;
21442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (warn != NULL)
21443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*warn = ctxt->warning;
21444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctx != NULL)
21445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ctx = ctxt->errCtxt;
21446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
21447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFacetTypeToString:
21451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the facet type
21452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Convert the xmlSchemaTypeType to a char string.
21454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the char string representation of the facet type if the
21456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     type is a facet and an "Internal Error" string otherwise.
21457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
21459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFacetTypeToString(xmlSchemaTypeType type)
21460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (type) {
21462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_PATTERN:
21463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "pattern");
21464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXEXCLUSIVE:
21465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxExclusive");
21466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXINCLUSIVE:
21467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxInclusive");
21468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINEXCLUSIVE:
21469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minExclusive");
21470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MININCLUSIVE:
21471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minInclusive");
21472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_WHITESPACE:
21473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "whiteSpace");
21474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_ENUMERATION:
21475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "enumeration");
21476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_LENGTH:
21477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "length");
21478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MAXLENGTH:
21479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "maxLength");
21480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_MINLENGTH:
21481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "minLength");
21482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_TOTALDIGITS:
21483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "totalDigits");
21484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_FACET_FRACTIONDIGITS:
21485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (BAD_CAST "fractionDigits");
21486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
21487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
21488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (BAD_CAST "Internal Error");
21490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaWhitespaceValueType
21493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type)
21494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The normalization type can be changed only for types which are derived
21497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * from xsd:string.
21498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC) {
21500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we assume a whitespace of preserve for anySimpleType.
21502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((type->builtInType == XML_SCHEMAS_STRING) ||
21504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (type->builtInType == XML_SCHEMAS_ANYSIMPLETYPE))
21505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_PRESERVE);
21506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (type->builtInType == XML_SCHEMAS_NORMSTRING)
21507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_REPLACE);
21508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
21509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2151060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * For all �atomic� datatypes other than string (and types �derived�
2151160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * by �restriction� from it) the value of whiteSpace is fixed to
21512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * collapse
21513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Note that this includes built-in list datatypes.
21514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
21515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(XML_SCHEMA_WHITESPACE_COLLAPSE);
21516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
21518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For list types the facet "whiteSpace" is fixed to "collapse".
21520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
21523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (XML_SCHEMA_WHITESPACE_UNKNOWN);
21524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_ATOMIC(type)) {
21525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_PRESERVE)
21526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_PRESERVE);
21527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (type->flags & XML_SCHEMAS_TYPE_WHITESPACE_REPLACE)
21528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_REPLACE);
21529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
21530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (XML_SCHEMA_WHITESPACE_COLLAPSE);
21531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
21533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
21536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Simple type validation				*
21538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
21543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			DOM Validation code				*
21545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssembleByLocation:
21550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pctxt:  a schema parser context
21551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt:  a schema validation context
21552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: the existing schema
21553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node that fired the assembling
21554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nsName: the namespace name of the new schema
21555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @location: the location of the schema
21556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expands an existing schema by an additional schema.
21558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the new schema is correct, a positive error code
21560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
21561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAssembleByLocation(xmlSchemaValidCtxtPtr vctxt,
21564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlSchemaPtr schema,
21565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlNodePtr node,
21566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *nsName,
21567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar *location)
21568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
21570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaParserCtxtPtr pctxt;
21571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaBucketPtr bucket = NULL;
21572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt == NULL) || (schema == NULL))
21574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
21575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->pctxt == NULL) {
21577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaAssembleByLocation",
21578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no parser context available");
21579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = vctxt->pctxt;
21582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt->constructor == NULL) {
21583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	PERROR_INT("xmlSchemaAssembleByLocation",
21584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no constructor");
21585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Acquire the schema document.
21589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    location = xmlSchemaBuildAbsoluteURI(pctxt->dict,
21591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	location, node);
21592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we pass XML_SCHEMA_SCHEMA_IMPORT here;
21594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the process will automatically change this to
21595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * XML_SCHEMA_SCHEMA_MAIN if it is the first schema document.
21596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaAddSchemaDoc(pctxt, XML_SCHEMA_SCHEMA_IMPORT,
2159860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	location, NULL, NULL, 0, node, NULL, nsName,
21599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	&bucket);
21600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
2160160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	return(ret);
2160260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (bucket == NULL) {
21603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Generate a warning that the document could not be located.
21605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
21607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node, NULL,
21608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The document at location '%s' could not be acquired",
21609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    location, NULL, NULL);
21610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ret);
21611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The first located schema will be handled as if all other
21614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * schemas imported by XSI were imported by this first schema.
21615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket != NULL) &&
21617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(WXS_CONSTRUCTOR(pctxt)->bucket == NULL))
21618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_CONSTRUCTOR(pctxt)->bucket = bucket;
21619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is this handled like an import? I.e. is it not an error
21621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * if the schema cannot be located?
21622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((bucket == NULL) || (! CAN_PARSE_SCHEMA(bucket)))
21624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
21625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * We will reuse the parser context for every schema imported
21627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * directly via XSI. So reset the context.
21628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->nberrors = 0;
21630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->err = 0;
21631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = bucket->doc;
2163260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2163360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    ret = xmlSchemaParseNewDocWithContext(pctxt, schema, bucket);
21634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1) {
21635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->doc = NULL;
21636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit_failure;
21637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Paranoid error channelling. */
21639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (pctxt->nberrors != 0))
2164060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ret = pctxt->err;
2164160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (pctxt->nberrors == 0) {
2164260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
21643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only bother to fixup pending components, if there was
21644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* no error yet.
21645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* For every XSI acquired schema (and its sub-schemata) we will
21646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* fixup the components.
21647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFixupComponents(pctxt, bucket);
21649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = pctxt->err;
21650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Not nice, but we need somehow to channel the schema parser
21652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* error to the validation context.
21653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret != 0) && (vctxt->err == 0))
21655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->err = ret;
21656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nberrors += pctxt->nberrors;
21657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2165860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* Add to validation error sum. */
21659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nberrors += pctxt->nberrors;
21660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = NULL;
21662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
21663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit_failure:
21664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->doc = NULL;
21665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
21666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttrInfoPtr
2166960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaGetMetaAttrInfo(xmlSchemaValidCtxtPtr vctxt,
21670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int metaType)
21671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
21673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
21674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
21675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
21676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
21677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->nbAttrInfos; i++) {
21679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[i];
21680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType == metaType)
21681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (iattr);
21682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
21686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAssembleByXSI:
21690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt:  a schema validation context
21691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Expands an existing schema by an additional schema using
21693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the xsi:schemaLocation or xsi:noNamespaceSchemaLocation attribute
21694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of an instance. If xsi:noNamespaceSchemaLocation is used, @noNamespace
21695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * must be set to 1.
21696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the new schema is correct, a positive error code
21698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * number otherwise and -1 in case of an internal or API error.
21699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAssembleByXSI(xmlSchemaValidCtxtPtr vctxt)
21702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *cur, *end;
21704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsname = NULL, *location;
21705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int count = 0;
21706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
21707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
21708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Parse the value; we will assume an even number of values
21711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * to be given (this is how Xerces and XSV work).
21712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
21713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * URGENT TODO: !! This needs to work for both
21714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @noNamespaceSchemaLocation AND @schemaLocation on the same
21715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * element !!
21716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC);
21719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
21720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
21721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC);
21722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
21723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
21724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = iattr->value;
21725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
21726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Move the string parsing mechanism away from here.
21728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->metaType == XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC) {
21730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
21731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the namespace name.
21732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
21733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
21734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
21735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
21736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
21737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
21738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
21739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
21740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    count++; /* TODO: Don't use the schema's dict. */
21741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nsname = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
21742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
21743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
21745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the URI.
21746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
21747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (IS_BLANK_CH(*cur))
21748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur++;
21749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	end = cur;
21750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*end != 0) && (!(IS_BLANK_CH(*end))))
21751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end++;
21752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (end == cur) {
21753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType ==
21754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC)
21755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
21756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
21757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* If using @schemaLocation then tuples are expected.
21758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* I.e. the namespace name *and* the document's URI.
2175960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
21760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomWarning(ACTXT_CAST vctxt, XML_SCHEMAV_MISC,
21761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->node, NULL,
21762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The value must consist of tuples: the target namespace "
21763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "name and the document's URI", NULL, NULL, NULL);
21764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
21766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	count++; /* TODO: Don't use the schema's dict. */
21768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	location = xmlDictLookup(vctxt->schema->dict, cur, end - cur);
21769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = end;
21770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaAssembleByLocation(vctxt, vctxt->schema,
21771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->node, nsname, location);
21772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
21773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaAssembleByXSI",
21774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"assembling schemata");
21775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
21776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*cur != 0);
21778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
21779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
21782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaLookupNamespace(xmlSchemaValidCtxtPtr vctxt,
21783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 const xmlChar *prefix)
21784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->sax != NULL) {
21786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i, j;
21787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr inode;
2178860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = vctxt->depth; i >= 0; i--) {
21790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->elemInfos[i]->nbNsBindings != 0) {
21791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode = vctxt->elemInfos[i];
21792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (j = 0; j < inode->nbNsBindings * 2; j += 2) {
21793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (((prefix == NULL) &&
21794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (inode->nsBindings[j] == NULL)) ||
21795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((prefix != NULL) && xmlStrEqual(prefix,
21796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->nsBindings[j]))) {
21797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
21799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Note that the namespace bindings are already
21800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* in a string dict.
21801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
2180260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return (inode->nsBindings[j+1]);
21803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
21804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
2180860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef LIBXML_READER_ENABLED
21809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->reader != NULL) {
21810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *nsName;
2181160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
21812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsName = xmlTextReaderLookupNamespace(vctxt->reader, prefix);
21813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName != NULL) {
21814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *ret;
21815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlDictLookup(vctxt->dict, nsName, -1);
21817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(nsName);
21818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ret);
21819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
21820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
21821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
21822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
21823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsPtr ns;
21824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->inode->node == NULL) ||
21826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->node->doc == NULL)) {
21827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaLookupNamespace",
21828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"no node or node's doc avaliable");
21829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
21830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ns = xmlSearchNs(vctxt->inode->node->doc,
21832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->node, prefix);
21833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ns != NULL)
21834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ns->href);
21835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
21836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
21840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* This one works on the schema of the validation context.
21841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
21842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2184360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaValidateNotation(xmlSchemaValidCtxtPtr vctxt,
21844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaPtr schema,
21845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlNodePtr node,
21846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  const xmlChar *value,
21847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaValPtr *val,
21848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  int valNeeded)
21849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
21851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt && (vctxt->schema == NULL)) {
21853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateNotation",
21854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "a schema is needed on the validation context");
21855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
21856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
21858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
21859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ret);
21860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
21861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *localName = NULL;
21862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *prefix = NULL;
21863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	localName = xmlSplitQName2(value, &prefix);
21865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prefix != NULL) {
21866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    const xmlChar *nsName = NULL;
21867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2186860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (vctxt != NULL)
21869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nsName = xmlSchemaLookupNamespace(vctxt, BAD_CAST prefix);
21870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else if (node != NULL) {
21871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlNsPtr ns = xmlSearchNs(node->doc, node, prefix);
21872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ns != NULL)
21873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nsName = ns->href;
21874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
21875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(prefix);
21876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(localName);
21877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (nsName == NULL) {
21880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(prefix);
21881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(localName);
21882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
21884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaGetNotation(schema, localName, nsName) != NULL) {
2188560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((valNeeded) && (val != NULL)) {
2188660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    (*val) = xmlSchemaNewNOTATIONValue(xmlStrdup(localName),
2188760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott						       xmlStrdup(nsName));
21888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*val == NULL)
21889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = -1;
21890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
21892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
21893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
21894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(localName);
21895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
21896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaGetNotation(schema, value, NULL) != NULL) {
21897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (valNeeded && (val != NULL)) {
21898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (*val) = xmlSchemaNewNOTATIONValue(
21899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			BAD_CAST xmlStrdup(value), NULL);
21900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (*val == NULL)
21901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = -1;
21902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
21903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
21904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (1);
21905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
21906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
21908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
21911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAddNodeQName(xmlSchemaValidCtxtPtr vctxt,
21912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar* lname,
21913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar* nsname)
21914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
21916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lname = xmlDictLookup(vctxt->dict, lname, -1);
21918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lname == NULL)
21919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
21920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nsname != NULL) {
21921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nsname = xmlDictLookup(vctxt->dict, nsname, -1);
21922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsname == NULL)
21923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
21924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nodeQNames->nbItems; i += 2) {
21926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->nodeQNames->items [i] == lname) &&
21927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->nodeQNames->items[i +1] == nsname))
21928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* Already there */
21929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(i);
21930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Add new entry. */
21932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = vctxt->nodeQNames->nbItems;
21933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) lname);
21934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListAdd(vctxt->nodeQNames, (void *) nsname);
21935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(i);
21936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
21939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *  Validation of identity-constraints (IDC)                            *
21941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
21942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
21943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAugmentIDC:
21946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idcDef: the IDC definition
21947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an augmented IDC definition item.
21949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the item, or NULL on internal errors.
21951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
21953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAugmentIDC(xmlSchemaIDCPtr idcDef,
21954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValidCtxtPtr vctxt)
21955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
21956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
21957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc = (xmlSchemaIDCAugPtr) xmlMalloc(sizeof(xmlSchemaIDCAug));
21959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (aidc == NULL) {
21960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(vctxt,
21961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "xmlSchemaAugmentIDC: allocating an augmented IDC definition",
21962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL);
21963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
21964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->keyrefDepth = -1;
21966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->def = idcDef;
21967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    aidc->next = NULL;
21968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs == NULL)
21969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = aidc;
21970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
21971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	aidc->next = vctxt->aidcs;
21972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = aidc;
21973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
21975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save if we have keyrefs at all.
21976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
21977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->hasKeyrefs == 0) &&
21978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(idcDef->type == XML_SCHEMA_TYPE_IDC_KEYREF))
21979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->hasKeyrefs = 1;
21980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaAugmentImportedIDC:
21984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @imported: the imported schema
21985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
21986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates an augmented IDC definition for the imported schema.
21987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
21988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
21989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaAugmentImportedIDC(xmlSchemaImportPtr imported, xmlSchemaValidCtxtPtr vctxt) {
21990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (imported->schema->idcDef != NULL) {
21991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlHashScan(imported->schema->idcDef ,
21992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlHashScanner) xmlSchemaAugmentIDC, vctxt);
21993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
21994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
21995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
21997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCNewBinding:
21998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @idcDef: the IDC definition of this binding
21999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates a new IDC binding.
22001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new IDC binding, NULL on internal errors.
22003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPSVIIDCBindingPtr
22005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCNewBinding(xmlSchemaIDCPtr idcDef)
22006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr ret;
22008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaPSVIIDCBindingPtr) xmlMalloc(
22010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCBinding));
22011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
22012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(NULL,
22013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "allocating a PSVI IDC binding item", NULL);
22014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
22015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaPSVIIDCBinding));
22017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->definition = idcDef;
22018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
22019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCStoreNodeTableItem:
22023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the IDC node table item
22025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The validation context is used to store IDC node table items.
22027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * They are stored to avoid copying them if IDC node-tables are merged
22028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * with corresponding parent IDC node-tables (bubbling).
22029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if succeeded, -1 on internal errors.
22031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCStoreNodeTableItem(xmlSchemaValidCtxtPtr vctxt,
22034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaPSVIIDCNodePtr item)
22035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to gobal list.
22038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcNodes == NULL) {
22040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(20 * sizeof(xmlSchemaPSVIIDCNodePtr));
22042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcNodes == NULL) {
22043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the IDC node table item list", NULL);
22045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes = 20;
22048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeIdcNodes <= vctxt->nbIdcNodes) {
22049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes *= 2;
22050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = (xmlSchemaPSVIIDCNodePtr *)
22051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->idcNodes, vctxt->sizeIdcNodes *
22052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCNodePtr));
22053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcNodes == NULL) {
22054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the IDC node table item list", NULL);
22056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->idcNodes[vctxt->nbIdcNodes++] = item;
22060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCStoreKey:
22066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @item: the IDC key
22068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The validation context is used to store an IDC key.
22070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if succeeded, -1 on internal errors.
22072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCStoreKey(xmlSchemaValidCtxtPtr vctxt,
22075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     xmlSchemaPSVIIDCKeyPtr key)
22076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add to gobal list.
22079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcKeys == NULL) {
22081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(40 * sizeof(xmlSchemaPSVIIDCKeyPtr));
22083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcKeys == NULL) {
22084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the IDC key storage list", NULL);
22086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcKeys = 40;
22089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeIdcKeys <= vctxt->nbIdcKeys) {
22090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcKeys *= 2;
22091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcKeys = (xmlSchemaPSVIIDCKeyPtr *)
22092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->idcKeys, vctxt->sizeIdcKeys *
22093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaPSVIIDCKeyPtr));
22094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcKeys == NULL) {
22095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
22096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the IDC key storage list", NULL);
22097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->idcKeys[vctxt->nbIdcKeys++] = key;
22101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAppendNodeTableItem:
22107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @bind: the IDC binding
22108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ntItem: the node-table item
22109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Appends the IDC node-table item to the binding.
22111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAppendNodeTableItem(xmlSchemaPSVIIDCBindingPtr bind,
22116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaPSVIIDCNodePtr ntItem)
22117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->nodeTable == NULL) {
22119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->sizeNodes = 10;
22120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
22122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable == NULL) {
22123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an array of IDC node-table items", NULL);
22125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
22126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (bind->sizeNodes <= bind->nbNodes) {
22128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->sizeNodes *= 2;
22129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
22130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(bind->nodeTable, bind->sizeNodes *
22131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sizeof(xmlSchemaPSVIIDCNodePtr));
22132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable == NULL) {
22133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating an array of IDC node-table items", NULL);
22135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
22136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    bind->nodeTable[bind->nbNodes++] = ntItem;
22139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
22140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAcquireBinding:
22144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the IDC matcher
22146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Looks up an PSVI IDC binding, for the IDC definition and
22148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * of the given matcher. If none found, a new one is created
22149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and added to the IDC table.
22150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns an IDC binding or NULL on internal errors.
22152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaPSVIIDCBindingPtr
22154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAcquireBinding(xmlSchemaValidCtxtPtr vctxt,
22155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			  xmlSchemaIDCMatcherPtr matcher)
22156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
22158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem = vctxt->elemInfos[matcher->depth];
22160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcTable == NULL) {
22162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcTable = xmlSchemaIDCNewBinding(matcher->aidc->def);
22163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ielem->idcTable == NULL)
22164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
22165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ielem->idcTable);
22166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
22167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCBindingPtr bind = NULL;
22168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = ielem->idcTable;
22170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
22171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->definition == matcher->aidc->def)
22172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(bind);
22173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->next == NULL) {
22174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind->next = xmlSchemaIDCNewBinding(matcher->aidc->def);
22175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (bind->next == NULL)
22176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (NULL);
22177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(bind->next);
22178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = bind->next;
22180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (bind != NULL);
22181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
22183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaItemListPtr
22186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAcquireTargetList(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
22187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaIDCMatcherPtr matcher)
22188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (matcher->targets == NULL)
22190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->targets = xmlSchemaItemListCreate();
22191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(matcher->targets);
22192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeKey:
22196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @key: the IDC key
22197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC key together with its compiled value.
22199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeKey(xmlSchemaPSVIIDCKeyPtr key)
22202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (key->val != NULL)
22204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(key->val);
22205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(key);
22206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeBinding:
22210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC binding. Note that the node table-items
22212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * are not freed.
22213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeBinding(xmlSchemaPSVIIDCBindingPtr bind)
22216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->nodeTable != NULL)
22218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(bind->nodeTable);
22219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind->dupls != NULL)
2222060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlSchemaItemListFree(bind->dupls);
22221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(bind);
22222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeIDCTable:
22226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @bind: the first IDC binding in the list
22227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees an IDC table, i.e. all the IDC bindings in the list.
22229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeIDCTable(xmlSchemaPSVIIDCBindingPtr bind)
22232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr prev;
22234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (bind != NULL) {
22236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	prev = bind;
22237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
22238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeBinding(prev);
22239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCFreeMatcherList:
22244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the first IDC matcher in the list
22245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Frees a list of IDC matchers.
22247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFreeMatcherList(xmlSchemaIDCMatcherPtr matcher)
22250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr next;
22252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
22254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = matcher->next;
2225560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (matcher->keySeqs != NULL) {
22256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
22257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->sizeKeySeqs; i++)
22258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs[i] != NULL)
22259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(matcher->keySeqs[i]);
2226060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlFree(matcher->keySeqs);
22261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matcher->targets != NULL) {
22263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
22265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCNodePtr idcNode;
22266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Node-table items for keyrefs are not stored globally
22268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to the validation context, since they are not bubbled.
22269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to free them here.
22270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < matcher->targets->nbItems; i++) {
22272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    idcNode =
22273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
22274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode->keys);
22275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode);
22276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(matcher->targets);
22279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(matcher);
22281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = next;
22282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCReleaseMatcherList:
22287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the first IDC matcher in the list
22289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Caches a list of IDC matchers for reuse.
22291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
22293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCReleaseMatcherList(xmlSchemaValidCtxtPtr vctxt,
22294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaIDCMatcherPtr matcher)
22295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr next;
22297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
22299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	next = matcher->next;
2230060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (matcher->keySeqs != NULL) {
22301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i;
22302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Don't free the array, but only the content.
22304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->sizeKeySeqs; i++)
22306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs[i] != NULL) {
22307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(matcher->keySeqs[i]);
22308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->keySeqs[i] = NULL;
22309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matcher->targets) {
22312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) {
22313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int i;
22314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCNodePtr idcNode;
22315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Node-table items for keyrefs are not stored globally
22317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* to the validation context, since they are not bubbled.
22318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* We need to free them here.
22319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		for (i = 0; i < matcher->targets->nbItems; i++) {
22321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    idcNode =
22322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaPSVIIDCNodePtr) matcher->targets->items[i];
22323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode->keys);
22324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(idcNode);
22325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListFree(matcher->targets);
22328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets = NULL;
2232960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->next = NULL;
22331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Cache the matcher.
22333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcMatcherCache != NULL)
22335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->nextCached = vctxt->idcMatcherCache;
22336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcMatcherCache = matcher;
22337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = next;
22339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCAddStateObject:
22344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @matcher: the IDC matcher
22346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sel: the XPath information
22347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent: the parent "selector" state object if any
22348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: "selector" or "field"
22349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/reuses and activates state objects for the given
22351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XPath information; if the XPath expression consists of unions,
22352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * multiple state objects are created for every unioned expression.
22353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCAddStateObject(xmlSchemaValidCtxtPtr vctxt,
22358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCMatcherPtr matcher,
22359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCSelectPtr sel,
22360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int type)
22361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto;
22363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reuse the state objects from the pool.
22366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStatePool != NULL) {
22368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = vctxt->xpathStatePool;
22369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xpathStatePool = sto->next;
22370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->next = NULL;
2237160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else {
22372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create a new state object.
22374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = (xmlSchemaIDCStateObjPtr) xmlMalloc(sizeof(xmlSchemaIDCStateObj));
22376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto == NULL) {
22377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(NULL,
22378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an IDC state object", NULL);
22379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(sto, 0, sizeof(xmlSchemaIDCStateObj));
2238260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
22383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2238460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Add to global list.
2238560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
22386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL)
22387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->next = vctxt->xpathStates;
22388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->xpathStates = sto;
22389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Free the old xpath validation context.
22392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sto->xpathCtxt != NULL)
22394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeStreamCtxt((xmlStreamCtxtPtr) sto->xpathCtxt);
22395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a new XPath (pattern) validation context.
22398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->xpathCtxt = (void *) xmlPatternGetStreamCtxt(
22400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlPatternPtr) sel->xpathComp);
22401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (sto->xpathCtxt == NULL) {
22402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaIDCAddStateObject",
22403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "failed to create an XPath validation context");
22404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
2240560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
22406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->type = type;
22407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->depth = vctxt->depth;
22408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->matcher = matcher;
22409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->sel = sel;
22410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto->nbHistory = 0;
2241160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "IDC:   STO push '%s'\n",
22414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->sel->xpath);
22415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
22417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathEvaluate:
22421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodeType: the nodeType of the current node
22423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Evaluates all active XPath state objects.
22425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of IC "field" state objects which resolved to
22427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * this node, 0 if none resolved and -1 on internal errors.
22428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathEvaluate(xmlSchemaValidCtxtPtr vctxt,
22431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlElementType nodeType)
22432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto, head = NULL, first;
22434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, resolved = 0, depth = vctxt->depth;
2243560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
22438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodeType == XML_ATTRIBUTE_NODE)
22440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth++;
22441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
22443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2244460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
2244560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    "IDC: EVAL on %s, depth %d, type %d\n",
22446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
22447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), depth, nodeType);
22448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
22449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process all active XPath state objects.
22453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    first = vctxt->xpathStates;
22455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = first;
22456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != head) {
22457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR)
2245960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] selector '%s'\n",
22460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->matcher->aidc->def->name, sto->sel->xpath);
22461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
2246260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    xmlGenericError(xmlGenericErrorContext, "IDC:   ['%s'] field '%s'\n",
22463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->matcher->aidc->def->name, sto->sel->xpath);
22464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE)
22466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlStreamPush((xmlStreamCtxtPtr) sto->xpathCtxt,
22467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, vctxt->inode->nsName);
22468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
22469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlStreamPushAttr((xmlStreamCtxtPtr) sto->xpathCtxt,
22470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, vctxt->inode->nsName);
22471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1) {
22473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaXPathEvaluate",
22474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlStreamPush()");
22475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 0)
22478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_sto;
22479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Full match.
22481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:     "
22484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "MATCH\n");
22485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Register a match in the state object history.
22488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->history == NULL) {
22490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->history = (int *) xmlMalloc(5 * sizeof(int));
22491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sto->history == NULL) {
2249260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
22493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating the state object history", NULL);
22494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
22495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sizeHistory = 5;
22497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->sizeHistory <= sto->nbHistory) {
22498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sizeHistory *= 2;
22499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->history = (int *) xmlRealloc(sto->history,
22500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->sizeHistory * sizeof(int));
22501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (sto->history == NULL) {
2250260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
22503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "re-allocating the state object history", NULL);
22504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
22505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2250660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->history[sto->nbHistory++] = depth;
22508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:       push match '%d'\n",
22511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth);
22512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
22515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCSelectPtr sel;
22516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Activate state objects for the IDC fields of
22518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the IDC selector.
22519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "IDC:     "
22522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"activating field states\n");
22523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sel = sto->matcher->aidc->def->fields;
22525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (sel != NULL) {
22526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCAddStateObject(vctxt, sto->matcher,
22527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sel, XPATH_STATE_OBJ_TYPE_IDC_FIELD) == -1)
22528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
22529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sel = sel->next;
22530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * An IDC key node was found by the IDC field.
22534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
22537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"IDC:     key found\n");
22538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Notify that the character value of this node is
22541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * needed.
22542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (resolved == 0) {
22544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((vctxt->inode->flags &
22545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_VALUE_NEEDED) == 0)
22546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
22547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    resolved++;
22549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sto:
22551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->next == NULL) {
22552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate field state objects created on this node as well.
22554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    head = first;
22556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = vctxt->xpathStates;
22557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
22558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
22559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (resolved);
22561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *
22564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFormatIDCKeySequence(xmlSchemaValidCtxtPtr vctxt,
22565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlChar **buf,
22566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaPSVIIDCKeyPtr *seq,
22567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int count)
22568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, res;
22570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value = NULL;
22571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrdup(BAD_CAST "[");
22573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < count; i++) {
22574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*buf = xmlStrcat(*buf, BAD_CAST "'");
2257560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	res = xmlSchemaGetCanonValueWhtspExt(seq[i]->val,
22576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaGetWhiteSpaceFacetValue(seq[i]->type),
22577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &value);
22578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == 0)
22579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST value);
22580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
22581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaFormatIDCKeySequence",
22582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"failed to compute a canonical value");
22583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "???");
22584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (i < count -1)
22586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "', ");
22587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
22588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *buf = xmlStrcat(*buf, BAD_CAST "'");
22589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value != NULL) {
22590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value);
22591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = NULL;
22592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
22594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *buf = xmlStrcat(*buf, BAD_CAST "]");
22595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (BAD_CAST *buf);
22597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathPop:
22601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops all XPath states.
22604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathPop(xmlSchemaValidCtxtPtr vctxt)
22609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto;
22611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
22612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(0);
22615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = vctxt->xpathStates;
22616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
22617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1)
22619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto = sto->next;
22621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (sto != NULL);
22622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
22623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
22624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
22626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaXPathProcessHistory:
22627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
22628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the simple/complex type of the current node if any at all
22629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val: the precompiled value
22630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
22631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Processes and pops the history items of the IDC state objects.
22632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * IDC key-sequences are validated/created on IDC bindings.
2263360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
22634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 on success and -1 on internal errors.
22635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
22636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
22637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaXPathProcessHistory(xmlSchemaValidCtxtPtr vctxt,
22638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int depth)
22639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
22640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCStateObjPtr sto, nextsto;
22641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, matchDepth;
22642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr key = NULL;
22643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr type = vctxt->inode->typeDef, simpleType = NULL;
22644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates == NULL)
22646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
22647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sto = vctxt->xpathStates;
22648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
22651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2265260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
22653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "IDC: BACK on %s, depth %d\n",
22654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFormatQName(&str, vctxt->inode->nsName,
22655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), vctxt->depth);
22656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
22657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2265860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
22659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
22660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the state objects.
22661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
22662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (sto != NULL) {
22663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	res = xmlStreamPop((xmlStreamCtxtPtr) sto->xpathCtxt);
22664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res == -1) {
22665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaXPathProcessHistory",
22666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlStreamPop()");
22667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
22668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
22669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
22670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:   stream pop '%s'\n",
22671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->sel->xpath);
22672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->nbHistory == 0)
22674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto deregister_check;
22675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matchDepth = sto->history[sto->nbHistory -1];
22677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
22678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
22679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only matches at the current depth are of interest.
22680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
22681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (matchDepth != depth) {
22682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
22683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
2268460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
22685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_FIELD) {
22686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * NOTE: According to
22688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   http://www.w3.org/Bugs/Public/show_bug.cgi?id=2198
22689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   ... the simple-content of complex types is also allowed.
22690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2269160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(type)) {
22693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_HAS_SIMPLE_CONTENT(type)) {
22694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Sanity check for complex types with simple content.
22696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    simpleType = type->contentTypeDef;
22698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (simpleType == NULL) {
22699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaXPathProcessHistory",
22700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "field resolves to a CT with simple content "
22701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "but the CT is missing the ST definition");
22702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
22705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    simpleType = NULL;
2270660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    } else
22707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		simpleType = type;
22708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (simpleType == NULL) {
22709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
2271060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Not qualified if the field resolves to a node of non
22713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* simple type.
2271460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
2271660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    XML_SCHEMAV_CVC_IDC, NULL,
22717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST sto->matcher->aidc->def,
22718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The XPath '%s' of a field of %s does evaluate to a node of "
22719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "non-simple type",
22720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sto->sel->xpath,
22721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetIDCDesignation(&str, sto->matcher->aidc->def));
22722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
22723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->nbHistory--;
22724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto deregister_check;
22725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2272660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((key == NULL) && (vctxt->inode->val == NULL)) {
22728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Failed to provide the normalized value; maybe
22730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the value was invalid.
22731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_IDC,
22733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST sto->matcher->aidc->def,
22734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Warning: No precomputed value available, the value "
22735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "was either invalid or something strange happend");
22736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->nbHistory--;
22737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto deregister_check;
22738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
22739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaIDCMatcherPtr matcher = sto->matcher;
22740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCKeyPtr *keySeq;
22741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int pos, idx;
2274260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The key will be anchored on the matcher's list of
22745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* key-sequences. The position in this list is determined
22746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* by the target node's depth relative to the matcher's
22747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* depth of creation (i.e. the depth of the scope element).
2274860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*
22749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Element        Depth    Pos   List-entries
22750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* <scope>          0              NULL
22751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   <bar>          1              NULL
22752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*     <target/>    2       2      target
22753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*   <bar>
22754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                * </scope>
22755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
22756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The size of the list is only dependant on the depth of
22757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the tree.
22758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* An entry will be NULLed in selector_leave, i.e. when
2275960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* we hit the target's
2276060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pos = sto->depth - matcher->depth;
22762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		idx = sto->sel->index;
2276360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create/grow the array of key-sequences.
22766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (matcher->keySeqs == NULL) {
2276860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if (pos > 9)
22769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs = pos * 2;
22770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
22771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs = 10;
2277260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlMalloc(matcher->sizeKeySeqs *
2277460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			sizeof(xmlSchemaPSVIIDCKeyPtr *));
2277560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if (matcher->keySeqs == NULL) {
22776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating an array of key-sequences",
22778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
22779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return(-1);
22780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memset(matcher->keySeqs, 0,
22782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs *
22783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKeyPtr *));
2278460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		} else if (pos >= matcher->sizeKeySeqs) {
22785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    int i = matcher->sizeKeySeqs;
2278660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->sizeKeySeqs *= 2;
22788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    matcher->keySeqs = (xmlSchemaPSVIIDCKeyPtr **)
22789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlRealloc(matcher->keySeqs,
22790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->sizeKeySeqs *
22791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKeyPtr *));
22792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (matcher->keySeqs == NULL) {
22793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "reallocating an array of key-sequences",
22795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    NULL);
22796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * The array needs to be NULLed.
22800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Use memset?
22801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2280260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    for (; i < matcher->sizeKeySeqs; i++)
2280360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			matcher->keySeqs[i] = NULL;
22804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2280560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Get/create the key-sequence.
22808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2280960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		keySeq = matcher->keySeqs[pos];
2281060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (keySeq == NULL) {
22811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto create_sequence;
22812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (keySeq[idx] != NULL) {
22813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
22814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * cvc-identity-constraint:
2281660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 3 For each node in the �target node set� all
22817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * of the {fields}, with that node as the context
22818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * node, evaluate to either an empty node-set or
22819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * a node-set with exactly one member, which must
22820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * have a simple type.
2282160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    *
22822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * The key was already set; report an error.
22823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2282460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
22825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, NULL,
22826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST matcher->aidc->def,
22827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The XPath '%s' of a field of %s evaluates to a "
22828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"node-set with more than one member",
22829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sto->sel->xpath,
22830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetIDCDesignation(&str, matcher->aidc->def));
22831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
22832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sto->nbHistory--;
22833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto deregister_check;
22834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
2283560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    goto create_key;
2283660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcreate_sequence:
22838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a key-sequence.
22840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		keySeq = (xmlSchemaPSVIIDCKeyPtr *) xmlMalloc(
2284260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    matcher->aidc->def->nbFields *
22843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sizeof(xmlSchemaPSVIIDCKeyPtr));
22844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (keySeq == NULL) {
2284560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaVErrMemory(NULL,
22846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating an IDC key-sequence", NULL);
2284760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return(-1);
2284860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
2284960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		memset(keySeq, 0, matcher->aidc->def->nbFields *
22850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    sizeof(xmlSchemaPSVIIDCKeyPtr));
22851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		matcher->keySeqs[pos] = keySeq;
22852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcreate_key:
22853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create a key once per node only.
2285560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
22856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (key == NULL) {
22857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key = (xmlSchemaPSVIIDCKeyPtr) xmlMalloc(
22858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCKey));
22859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (key == NULL) {
22860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaVErrMemory(NULL,
22861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating a IDC key", NULL);
22862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlFree(keySeq);
22863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			matcher->keySeqs[pos] = NULL;
2286460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			return(-1);
22865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Consume the compiled value.
22868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key->type = simpleType;
22870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    key->val = vctxt->inode->val;
22871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->val = NULL;
22872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Store the key in a global list.
22874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIDCStoreKey(vctxt, key) == -1) {
22876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCFreeKey(key);
22877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
22878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2288060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		keySeq[idx] = key;
22881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (sto->type == XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) {
2288360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCKeyPtr **keySeq = NULL;
22885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* xmlSchemaPSVIIDCBindingPtr bind; */
22886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCNodePtr ntItem;
22887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCMatcherPtr matcher;
22888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCPtr idc;
22889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaItemListPtr targets;
22890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int pos, i, j, nbKeys;
22891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Here we have the following scenario:
22893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * An IDC 'selector' state object resolved to a target node,
2289460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * during the time this target node was in the
2289560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * ancestor-or-self axis, the 'field' state object(s) looked
2289660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * out for matching nodes to create a key-sequence for this
22897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * target node. Now we are back to this target node and need
2289860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * to put the key-sequence, together with the target node
2289960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * itself, into the node-table of the corresponding IDC
22900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * binding.
22901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = sto->matcher;
22903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc = matcher->aidc->def;
22904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbKeys = idc->nbFields;
2290560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    pos = depth - matcher->depth;
22906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check if the matcher has any key-sequences at all, plus
22908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if it has a key-sequence for the current target node.
2290960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
22910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((matcher->keySeqs == NULL) ||
22911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(matcher->sizeKeySeqs <= pos)) {
22912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_key_error;
22914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
22915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2291760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2291860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    keySeq = &(matcher->keySeqs[pos]);
22919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*keySeq == NULL) {
22920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEY)
22921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_key_error;
22922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
22923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2292560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < nbKeys; i++) {
22927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((*keySeq)[i] == NULL) {
22928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
22929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Not qualified, if not all fields did resolve.
22930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
22931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (idc->type == XML_SCHEMA_TYPE_IDC_KEY) {
22932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
22933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* All fields of a "key" IDC must resolve.
22934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
22935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto selector_key_error;
2293660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
22937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
22938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
22939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
22940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * All fields did resolve.
22942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2294360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
22945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * 4.1 If the {identity-constraint category} is unique(/key),
2294660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * then no two members of the �qualified node set� have
2294760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �key-sequences� whose members are pairwise equal, as
22948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * defined by Equal in [XML Schemas: Datatypes].
22949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
22950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the IDC binding from the matcher and check for
22951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * duplicate key-sequences.
22952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
22953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
22954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
22955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    targets = xmlSchemaIDCAcquireTargetList(vctxt, matcher);
2295760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if ((idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) &&
22958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(targets->nbItems != 0)) {
22959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaPSVIIDCKeyPtr ckey, bkey, *bkeySeq;
2296060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
22961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i = 0;
22962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = 0;
22963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
22964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Compare the key-sequences, key by key.
22965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
22966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
22967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bkeySeq =
22968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaPSVIIDCNodePtr) targets->items[i])->keys;
22969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < nbKeys; j++) {
22970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ckey = (*keySeq)[j];
2297160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			bkey = bkeySeq[j];
22972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			res = xmlSchemaAreValuesEqual(ckey->val, bkey->val);
22973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == -1) {
22974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    return (-1);
22975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (res == 0) {
22976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
22977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * One of the keys differs, so the key-sequence
22978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * won't be equal; get out.
22979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
22980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
22981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
22982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (res == 1) {
22984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
22985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Duplicate key-sequence found.
22986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
22987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
22988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
22989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    i++;
22990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (i < targets->nbItems);
22991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (i != targets->nbItems) {
22992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL, *strB = NULL;
2299360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
22994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO: Try to report the key-sequence.
22995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2299660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
22997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, NULL,
22998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			WXS_BASIC_CAST idc,
22999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Duplicate key-sequence %s in %s",
23000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatIDCKeySequence(vctxt, &str,
23001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (*keySeq), nbKeys),
23002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetIDCDesignation(&strB, idc));
23003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
23004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strB);
23005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto selector_leave;
23006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Add a node-table item to the IDC binding.
23010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem = (xmlSchemaPSVIIDCNodePtr) xmlMalloc(
23012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sizeof(xmlSchemaPSVIIDCNode));
23013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ntItem == NULL) {
2301460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(NULL,
23015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating an IDC node-table item", NULL);
23016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(*keySeq);
23017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*keySeq = NULL;
23018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
2301960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
23020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(ntItem, 0, sizeof(xmlSchemaPSVIIDCNode));
2302160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2302260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
23023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Store the node-table item in a global list.
23024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (idc->type != XML_SCHEMA_TYPE_IDC_KEYREF) {
23026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCStoreNodeTableItem(vctxt, ntItem) == -1) {
23027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*keySeq);
23029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *keySeq = NULL;
23030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
23031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ntItem->nodeQNameID = -1;
23033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
23034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Save a cached QName for this node on the IDC node, to be
23036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* able to report it, even if the node is not saved.
23037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ntItem->nodeQNameID = xmlSchemaVAddNodeQName(vctxt,
23039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->localName, vctxt->inode->nsName);
23040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ntItem->nodeQNameID == -1) {
23041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(*keySeq);
23043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *keySeq = NULL;
2304460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    return (-1);
23045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Init the node-table item: Save the node, position and
23049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * consume the key-sequence.
23050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->node = vctxt->node;
23052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->nodeLine = vctxt->inode->nodeLine;
23053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ntItem->keys = *keySeq;
23054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *keySeq = NULL;
23055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
2305660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (xmlSchemaIDCAppendNodeTableItem(bind, ntItem) == -1)
23057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaItemListAdd(targets, ntItem) == -1) {
23059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
2306060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
23061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Free the item, since keyref items won't be
23062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * put on a global list.
23063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem->keys);
23065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ntItem);
23066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
23068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2306960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto selector_leave;
23071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectselector_key_error:
23072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    {
23073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
23074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2307560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 4.2.1 (KEY) The �target node set� and the
2307660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* �qualified node set� are equal, that is, every
2307760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* member of the �target node set� is also a member
2307860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* of the �qualified node set� and vice versa.
23079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
2308060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaCustomErr(ACTXT_CAST vctxt,
23081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_IDC, NULL,
23082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST idc,
23083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Not all fields of %s evaluate to a node",
23084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetIDCDesignation(&str, idc), NULL);
23085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
23086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectselector_leave:
23088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Free the key-sequence if not added to the IDC table.
23090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((keySeq != NULL) && (*keySeq != NULL)) {
23092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(*keySeq);
23093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*keySeq = NULL;
23094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} /* if selector */
2309660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	sto->nbHistory--;
23098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectderegister_check:
23100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Deregister state objects if they reach the depth of creation.
23102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((sto->nbHistory == 0) && (sto->depth == depth)) {
23104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
23105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext, "IDC:   STO pop '%s'\n",
23106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		sto->sel->xpath);
23107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->xpathStates != sto) {
23109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaXPathProcessHistory",
23110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The state object to be removed is not the first "
23111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "in the list");
23112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nextsto = sto->next;
23114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Unlink from the list of active XPath state objects.
23116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->xpathStates = sto->next;
23118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto->next = vctxt->xpathStatePool;
23119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Link it to the pool of reusable state objects.
23121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->xpathStatePool = sto;
23123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = nextsto;
23124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
23125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sto = sto->next;
23126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } /* while (sto != NULL) */
23127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
23131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIDCRegisterMatchers:
23132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
23133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDecl: the element declaration
23134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates helper objects to evaluate IDC selectors/fields
23136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * successively.
23137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if OK and -1 on internal errors.
23139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCRegisterMatchers(xmlSchemaValidCtxtPtr vctxt,
23142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaElementPtr elemDecl)
23143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher, last = NULL;
23145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCPtr idc, refIdc;
23146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
2314760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    idc = (xmlSchemaIDCPtr) elemDecl->idcs;
23149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (idc == NULL)
23150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
2315160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC
23153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
23154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
2315560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	xmlGenericError(xmlGenericErrorContext,
23156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "IDC: REGISTER on %s, depth %d\n",
23157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (char *) xmlSchemaFormatQName(&str, vctxt->inode->nsName,
23158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName), vctxt->depth);
23159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
23160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
23162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->idcMatchers != NULL) {
23163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaIDCRegisterMatchers",
23164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The chain of IDC matchers is expected to be empty");
23165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
23166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
23168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (idc->type == XML_SCHEMA_TYPE_IDC_KEYREF) {
23169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Since IDCs bubbles are expensive we need to know the
23171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * depth at which the bubbles should stop; this will be
23172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the depth of the top-most keyref IDC. If no keyref
23173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * references a key/unique IDC, the keyrefDepth will
23174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * be -1, indicating that no bubbles are needed.
23175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    refIdc = (xmlSchemaIDCPtr) idc->ref->item;
23177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (refIdc != NULL) {
23178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Remember that we have keyrefs on this node.
23180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->hasKeyrefs = 1;
23182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Lookup the referenced augmented IDC info.
23184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc = vctxt->aidcs;
23186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (aidc != NULL) {
23187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (aidc->def == refIdc)
23188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
23189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    aidc = aidc->next;
23190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (aidc == NULL) {
23192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaIDCRegisterMatchers",
23193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"Could not find an augmented IDC item for an IDC "
23194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"definition");
23195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
2319660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
23197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((aidc->keyrefDepth == -1) ||
23198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (vctxt->depth < aidc->keyrefDepth))
23199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    aidc->keyrefDepth = vctxt->depth;
23200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Lookup the augmented IDC item for the IDC definition.
23204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	aidc = vctxt->aidcs;
23206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (aidc != NULL) {
23207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (aidc->def == idc)
23208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
23209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = aidc->next;
23210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (aidc == NULL) {
23212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaIDCRegisterMatchers",
23213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Could not find an augmented IDC item for an IDC definition");
23214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
23215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create an IDC matcher for every IDC definition.
23218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->idcMatcherCache != NULL) {
23220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Reuse a cached matcher.
23222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = vctxt->idcMatcherCache;
23224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->idcMatcherCache = matcher->nextCached;
23225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->nextCached = NULL;
23226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
2322760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    matcher = (xmlSchemaIDCMatcherPtr)
23228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlMalloc(sizeof(xmlSchemaIDCMatcher));
23229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (matcher == NULL) {
2323060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlSchemaVErrMemory(vctxt,
23231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "allocating an IDC matcher", NULL);
23232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
23233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memset(matcher, 0, sizeof(xmlSchemaIDCMatcher));
23235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (last == NULL)
23237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->idcMatchers = matcher;
23238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
23239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    last->next = matcher;
23240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	last = matcher;
23241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->type = IDC_MATCHER;
2324360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	matcher->depth = vctxt->depth;
23244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->aidc = aidc;
23245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher->idcType = aidc->def->type;
2324660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#ifdef DEBUG_IDC
23247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlGenericError(xmlGenericErrorContext, "IDC:   register matcher\n");
2324860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
23249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2325060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Init the automaton state object.
23251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2325260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (xmlSchemaIDCAddStateObject(vctxt, matcher,
23253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    idc->selector, XPATH_STATE_OBJ_TYPE_IDC_SELECTOR) == -1)
23254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
23255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	idc = idc->next;
23257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (idc != NULL);
23258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIDCFillNodeTables(xmlSchemaValidCtxtPtr vctxt,
23263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   xmlSchemaNodeInfoPtr ielem)
23264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind;
23266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res, i, j, k, nbTargets, nbFields, nbDupls, nbNodeTable;
23267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCKeyPtr *keys, *ntkeys;
23268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr *targets, *dupls;
2326960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher = ielem->idcMatchers;
23271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* vctxt->createIDCNodeTables */
23272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
23273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip keyref IDCs and empty IDC target-lists.
23275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((matcher->aidc->def->type == XML_SCHEMA_TYPE_IDC_KEYREF) ||
23277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    WXS_ILIST_IS_EMPTY(matcher->targets))
23278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->next;
23280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
23281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If we _want_ the IDC node-table to be created in any case
23284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then do so. Otherwise create them only if keyrefs need them.
23285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! vctxt->createIDCNodeTables) &&
23287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((matcher->aidc->keyrefDepth == -1) ||
23288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (matcher->aidc->keyrefDepth > vctxt->depth)))
23289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->next;
23291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
23292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get/create the IDC binding on this element for the IDC definition.
23295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = xmlSchemaIDCAcquireBinding(vctxt, matcher);
23297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! WXS_ILIST_IS_EMPTY(bind->dupls)) {
23299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dupls = (xmlSchemaPSVIIDCNodePtr *) bind->dupls->items;
23300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbDupls = bind->dupls->nbItems;
23301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    dupls = NULL;
2330360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    nbDupls = 0;
23304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (bind->nodeTable != NULL) {
23306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbNodeTable = bind->nbNodes;
23307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbNodeTable = 0;
23309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nbNodeTable == 0) && (nbDupls == 0)) {
23312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Transfer all IDC target-nodes to the IDC node-table.
23314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->nodeTable =
2331660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		(xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->sizeNodes = matcher->targets->sizeItems;
23318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind->nbNodes = matcher->targets->nbItems;
23319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->items = NULL;
23321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->sizeItems = 0;
2332260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    matcher->targets->nbItems = 0;
23323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Compare the key-sequences and add to the IDC node-table.
23326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbTargets = matcher->targets->nbItems;
2332860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    targets = (xmlSchemaPSVIIDCNodePtr *) matcher->targets->items;
23329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = matcher->aidc->def->nbFields;
23330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    i = 0;
23331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
23332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		keys = targets[i]->keys;
2333360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (nbDupls) {
23334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Search in already found duplicates first.
23336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j = 0;
2333860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    do {
23339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[0]->val,
23341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				dupls[j]->keys[0]->val);
23342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == -1)
23343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Equal key-sequence.
23347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_target;
23349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = 0;
23352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ntkeys = dupls[j]->keys;
23353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ntkeys[k]->val);
23356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == -1)
23357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0) {
23359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    /*
23360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    * One of the keys differs.
23361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    */
23362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Equal key-sequence found.
23368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_target;
23370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
2337360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    } while (j < nbDupls);
23374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (nbNodeTable) {
23376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    j = 0;
2337760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    do {
23378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[0]->val,
23380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				bind->nodeTable[j]->keys[0]->val);
23381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == -1)
23382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 0) {
23384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* The key-sequence differs.
23386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto next_node_table_entry;
23388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = 0;
23391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ntkeys = bind->nodeTable[j]->keys;
23392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    ntkeys[k]->val);
23395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == -1)
23396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0) {
23398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    /*
23399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    * One of the keys differs.
23400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    */
23401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto next_node_table_entry;
23402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2340460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			}
23405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Add the duplicate to the list of duplicates.
23407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (bind->dupls == NULL) {
23409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    bind->dupls = xmlSchemaItemListCreate();
23410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (bind->dupls == NULL)
23411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
2341260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			}
23413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (xmlSchemaItemListAdd(bind->dupls, bind->nodeTable[j]) == -1)
23414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto internal_error;
23415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Remove the duplicate entry from the IDC node-table.
23417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nodeTable[j] = bind->nodeTable[bind->nbNodes -1];
23419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nbNodes--;
23420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_target;
23422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_node_table_entry:
23424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } while (j < nbNodeTable);
23426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* If everything is fine, then add the IDC target-node to
23429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the IDC node-table.
23430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaIDCAppendNodeTableItem(bind, targets[i]) == -1)
23432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
23433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_target:
23435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		i++;
23436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (i < nbTargets);
23437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = matcher->next;
23439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
23441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
23443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
23444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2344760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaBubbleIDCNodeTables:
23448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth: the current tree depth
23449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2345060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Merges IDC bindings of an element at @depth into the corresponding IDC
2345160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * bindings of its parent element. If a duplicate note-table entry is found,
2345260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * both, the parent node-table entry and child entry are discarded from the
23453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * node-table of the parent.
23454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if OK and -1 on internal errors.
23456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaBubbleIDCNodeTables(xmlSchemaValidCtxtPtr vctxt)
23459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind; /* IDC bindings of the current node. */
23461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr *parTable, parBind = NULL; /* parent IDC bindings. */
23462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCNodePtr node, parNode = NULL, *dupls, *parNodes; /* node-table entries. */
23463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCAugPtr aidc;
23464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k, ret = 0, nbFields, oldNum, oldDupls;
23465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2346660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    bind = vctxt->inode->idcTable;
23467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (bind == NULL) {
23468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Fine, no table, no bubbles. */
23469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
23470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2347160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parTable = &(vctxt->elemInfos[vctxt->depth -1]->idcTable);
23473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Walk all bindings; create new or add to existing bindings.
23475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Remove duplicate key-sequences.
23476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (bind != NULL) {
2347860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((bind->nbNodes == 0) && WXS_ILIST_IS_EMPTY(bind->dupls))
23480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_binding;
23481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Check if the key/unique IDC table needs to be bubbled.
23483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
23484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! vctxt->createIDCNodeTables) {
23485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = vctxt->aidcs;
23486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    do {
23487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (aidc->def == bind->definition) {
2348860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    if ((aidc->keyrefDepth == -1) ||
23489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(aidc->keyrefDepth >= vctxt->depth)) {
23490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto next_binding;
23491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
23493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc = aidc->next;
23495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } while (aidc != NULL);
23496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parTable != NULL)
23499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = *parTable;
23500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
23501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Search a matching parent binding for the
23502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* IDC definition.
23503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2350460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	while (parBind != NULL) {
23505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (parBind->definition == bind->definition)
23506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
23507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = parBind->next;
23508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (parBind != NULL) {
23511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2351260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Compare every node-table entry of the child node,
23513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * i.e. the key-sequence within, ...
23514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    oldNum = parBind->nbNodes; /* Skip newly added items. */
23516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! WXS_ILIST_IS_EMPTY(parBind->dupls)) {
23518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		oldDupls = parBind->dupls->nbItems;
23519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dupls = (xmlSchemaPSVIIDCNodePtr *) parBind->dupls->items;
23520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
23521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		dupls = NULL;
2352260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		oldDupls = 0;
23523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2352460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parNodes = parBind->nodeTable;
23526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = bind->definition->nbFields;
2352760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < bind->nbNodes; i++) {
23529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		node = bind->nodeTable[i];
23530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (node == NULL)
23531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
23532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ...with every key-sequence of the parent node, already
23534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* evaluated to be a duplicate key-sequence.
23535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (oldDupls) {
2353760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    j = 0;
23538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (j < oldDupls) {
23539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlSchemaAreValuesEqual(
23541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				node->keys[0]->val,
23542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				dupls[j]->keys[0]->val);
23543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == -1)
23544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == 0) {
23546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				j++;
23547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				continue;
23548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else {
23550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parNode = dupls[j];
23551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ret = xmlSchemaAreValuesEqual(
23553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    node->keys[k]->val,
23554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    parNode->keys[k]->val);
23555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == -1)
23556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == 0)
23558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret == 1)
23562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* Duplicate found. */
23563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (j != oldDupls) {
23567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* Duplicate found. Skip this entry. */
23568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			continue;
23569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
2357060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
23571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* ... and with every key-sequence of the parent node.
23573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (oldNum) {
2357560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    j = 0;
23576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while (j < oldNum) {
23577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNode = parNodes[j];
23578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (nbFields == 1) {
23579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret = xmlSchemaAreValuesEqual(
23580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				node->keys[0]->val,
23581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				parNode->keys[0]->val);
23582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == -1)
23583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (ret == 0) {
23585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				j++;
23586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				continue;
23587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
2358860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			} else {
23589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				ret = xmlSchemaAreValuesEqual(
23591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    node->keys[k]->val,
23592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    parNode->keys[k]->val);
23593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == -1)
23594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    goto internal_error;
23595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (ret == 0)
23596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (ret == 1)
23600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* Duplicate found. */
23601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			j++;
23603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (j != oldNum) {
23605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Handle duplicates. Move the duplicate in
23607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the parent's node-table to the list of
23608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* duplicates.
2360960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			*/
23610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			oldNum--;
23611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parBind->nbNodes--;
23612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Move last old item to pos of duplicate.
23614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes[j] = parNodes[oldNum];
2361660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (parBind->nbNodes != oldNum) {
23618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
2361960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    * If new items exist, move last new item to
23620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * last of old items.
23621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
2362260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parNodes[oldNum] =
23623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				parNodes[parBind->nbNodes];
23624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (parBind->dupls == NULL) {
23626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->dupls = xmlSchemaItemListCreate();
23627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->dupls == NULL)
23628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
2363060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaItemListAdd(parBind->dupls, parNode);
23631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else {
23632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
2363360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* Add the node-table entry (node and key-sequence) of
23634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* the child node to the node table of the parent node.
23635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
2363660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			if (parBind->nodeTable == NULL) {
2363760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlMalloc(10 * sizeof(xmlSchemaPSVIIDCNodePtr));
23639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->nodeTable == NULL) {
2364060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlSchemaVErrMemory(NULL,
23641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "allocating IDC list of node-table items", NULL);
23642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
23643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->sizeNodes = 1;
23645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else if (parBind->nbNodes >= parBind->sizeNodes) {
23646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parBind->sizeNodes *= 2;
2364760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
2364860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlRealloc(parBind->nodeTable, parBind->sizeNodes *
23649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				sizeof(xmlSchemaPSVIIDCNodePtr));
23650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (parBind->nodeTable == NULL) {
2365160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				xmlSchemaVErrMemory(NULL,
23652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "re-allocating IDC list of node-table items", NULL);
23653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
2365460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    }
23655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes = parBind->nodeTable;
23657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Append the new node-table entry to the 'new node-table
23659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* entries' section.
23660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parNodes[parBind->nbNodes++] = node;
23662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2366460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		}
2366560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2366660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
23667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
23668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * No binding for the IDC was found: create a new one and
23670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * copy all node-tables.
23671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    parBind = xmlSchemaIDCNewBinding(bind->definition);
23673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (parBind == NULL)
23674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
2367560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Hmm, how to optimize the initial number of
23678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * allocated entries?
23679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->nbNodes != 0) {
23681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add all IDC node-table entries.
23683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! vctxt->psviExposeIDCNodeTables) {
23685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Just move the entries.
23687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * NOTE: this is quite save here, since
23688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all the keyref lookups have already been
23689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * performed.
23690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
23691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nodeTable = bind->nodeTable;
23692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->nodeTable = NULL;
23693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->sizeNodes = bind->sizeNodes;
23694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->sizeNodes = 0;
23695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nbNodes = bind->nbNodes;
23696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->nbNodes = 0;
23697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
23698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
23699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Copy the entries.
23700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
2370160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    parBind->nodeTable = (xmlSchemaPSVIIDCNodePtr *)
23702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlMalloc(bind->nbNodes *
23703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(xmlSchemaPSVIIDCNodePtr));
23704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (parBind->nodeTable == NULL) {
2370560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaVErrMemory(NULL,
23706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "allocating an array of IDC node-table "
23707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "items", NULL);
23708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaIDCFreeBinding(parBind);
23709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
23710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->sizeNodes = bind->nbNodes;
23712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    parBind->nbNodes = bind->nbNodes;
23713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memcpy(parBind->nodeTable, bind->nodeTable,
23714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			bind->nbNodes * sizeof(xmlSchemaPSVIIDCNodePtr));
23715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (bind->dupls) {
23718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
23719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Move the duplicates.
23720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
23721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (parBind->dupls != NULL)
23722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaItemListFree(parBind->dupls);
23723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		parBind->dupls = bind->dupls;
2372460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		bind->dupls = NULL;
23725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23726df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (parTable != NULL) {
23727df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (*parTable == NULL)
23728df143a5041f03a22808b59c76698770b74692815Selim Gurun                    *parTable = parBind;
23729df143a5041f03a22808b59c76698770b74692815Selim Gurun                else {
23730df143a5041f03a22808b59c76698770b74692815Selim Gurun                    parBind->next = *parTable;
23731df143a5041f03a22808b59c76698770b74692815Selim Gurun                    *parTable = parBind;
23732df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
23733df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
2373460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
23735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_binding:
23737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	bind = bind->next;
23738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
23742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
23743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
23746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaCheckCVCIDCKeyRef:
23747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
23748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elemDecl: the element declaration
23749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
23750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the cvc-idc-keyref constraints.
23751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCVCIDCKeyRef(xmlSchemaValidCtxtPtr vctxt)
23754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaIDCMatcherPtr matcher;
23756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPSVIIDCBindingPtr bind;
2375760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    matcher = vctxt->inode->idcMatchers;
23759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Find a keyref.
23761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (matcher != NULL) {
23763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((matcher->idcType == XML_SCHEMA_TYPE_IDC_KEYREF) &&
23764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets &&
23765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher->targets->nbItems)
23766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
23767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int i, j, k, res, nbFields, hasDupls;
23768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCKeyPtr *refKeys, *keys;
23769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaPSVIIDCNodePtr refNode = NULL;
23770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    nbFields = matcher->aidc->def->nbFields;
23772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Find the IDC node-table for the referenced IDC key/unique.
23775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    bind = vctxt->inode->idcTable;
23777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (bind != NULL) {
2377860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if ((xmlSchemaIDCPtr) matcher->aidc->def->ref->item ==
23779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    bind->definition)
23780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
23781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		bind = bind->next;
23782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    hasDupls = (bind && bind->dupls && bind->dupls->nbItems) ? 1 : 0;
23784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
23785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Search for a matching key-sequences.
23786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
23787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (i = 0; i < matcher->targets->nbItems; i++) {
23788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		res = 0;
23789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		refNode = matcher->targets->items[i];
23790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (bind != NULL) {
23791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    refKeys = refNode->keys;
23792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    for (j = 0; j < bind->nbNodes; j++) {
23793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			keys = bind->nodeTable[j]->keys;
23794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (k = 0; k < nbFields; k++) {
23795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    res = xmlSchemaAreValuesEqual(keys[k]->val,
23796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				refKeys[k]->val);
23797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 0)
23798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
23799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    else if (res == -1) {
23800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				return (-1);
23801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (res == 1) {
23804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /*
23805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    * Match found.
23806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    */
23807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
23808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((res == 0) && hasDupls) {
23811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
23812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Search in duplicates
23813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
23814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			for (j = 0; j < bind->dupls->nbItems; j++) {
23815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    keys = ((xmlSchemaPSVIIDCNodePtr)
23816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				bind->dupls->items[j])->keys;
23817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    for (k = 0; k < nbFields; k++) {
23818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				res = xmlSchemaAreValuesEqual(keys[k]->val,
23819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    refKeys[k]->val);
23820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (res == 0)
23821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
23822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				else if (res == -1) {
23823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    return (-1);
23824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
23825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (res == 1) {
23827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				/*
23828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				* Match in duplicates found.
23829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				*/
23830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlChar *str = NULL, *strB = NULL;
23831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xmlSchemaKeyrefErr(vctxt,
23832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    XML_SCHEMAV_CVC_IDC, refNode,
23833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    (xmlSchemaTypePtr) matcher->aidc->def,
23834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "More than one match found for "
23835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "key-sequence %s of keyref '%s'",
23836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaFormatIDCKeySequence(vctxt, &str,
23837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					refNode->keys, nbFields),
23838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlSchemaGetComponentQName(&strB,
23839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					matcher->aidc->def));
23840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(str);
23841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				FREE_AND_NULL(strB);
23842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				break;
23843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
23844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
23845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
23846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2384760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
23848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (res == 0) {
23849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL, *strB = NULL;
23850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaKeyrefErr(vctxt,
23851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_IDC, refNode,
23852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaTypePtr) matcher->aidc->def,
23853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"No match found for key-sequence %s of keyref '%s'",
23854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatIDCKeySequence(vctxt, &str,
23855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    refNode->keys, nbFields),
23856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaGetComponentQName(&strB, matcher->aidc->def));
23857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str);
23858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(strB);
23859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
23860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	matcher = matcher->next;
23863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO: Return an error if any error encountered. */
23865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
23869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
23870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			XML Reader validation code                      *
23871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
23872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
23873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaAttrInfoPtr
23875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetFreshAttrInfo(xmlSchemaValidCtxtPtr vctxt)
23876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
23878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Grow/create list of attribute infos.
23880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->attrInfos == NULL) {
23882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(sizeof(xmlSchemaAttrInfoPtr));
23884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeAttrInfos = 1;
23885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->attrInfos == NULL) {
23886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
23887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating attribute info list", NULL);
23888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeAttrInfos <= vctxt->nbAttrInfos) {
23891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeAttrInfos++;
23892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->attrInfos = (xmlSchemaAttrInfoPtr *)
23893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->attrInfos,
23894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->sizeAttrInfos * sizeof(xmlSchemaAttrInfoPtr));
23895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->attrInfos == NULL) {
23896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
23897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating attribute info list", NULL);
23898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
23901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[vctxt->nbAttrInfos++];
23902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->localName != NULL) {
23903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaGetFreshAttrInfo",
23904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"attr info not cleared");
23905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
23906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr->nodeType = XML_ATTRIBUTE_NODE;
23908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (iattr);
23909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create an attribute info.
23912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr = (xmlSchemaAttrInfoPtr)
23914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlMalloc(sizeof(xmlSchemaAttrInfo));
23915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL) {
23916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaVErrMemory(vctxt, "creating new attribute info", NULL);
23917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
23918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(iattr, 0, sizeof(xmlSchemaAttrInfo));
23920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    iattr->nodeType = XML_ATTRIBUTE_NODE;
23921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->attrInfos[vctxt->nbAttrInfos++] = iattr;
23922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (iattr);
23924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
23927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPushAttribute(xmlSchemaValidCtxtPtr vctxt,
23928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr attrNode,
23929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int nodeLine,
23930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *localName,
2393160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			const xmlChar *nsName,
23932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ownedNames,
23933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar *value,
23934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int ownedValue)
23935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr attr;
23937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr = xmlSchemaGetFreshAttrInfo(vctxt);
23939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr == NULL) {
23940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaPushAttribute",
23941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaGetFreshAttrInfo()");
23942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
23943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->node = attrNode;
23945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->nodeLine = nodeLine;
23946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->state = XML_SCHEMAS_ATTR_UNKNOWN;
23947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->localName = localName;
23948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->nsName = nsName;
23949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownedNames)
23950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
23951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
23952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate if it's an XSI attribute.
23953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
23954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nsName != NULL) {
23955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlStrEqual(localName, BAD_CAST "nil")) {
23956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
2395760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NIL;
23958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "type")) {
23960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_TYPE;
23962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "schemaLocation")) {
23964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC;
23966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(localName, BAD_CAST "noNamespaceSchemaLocation")) {
23968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(attr->nsName, xmlSchemaInstanceNs)) {
23969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr->metaType = XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC;
23970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
23971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (xmlStrEqual(attr->nsName, xmlNamespaceNs)) {
23972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->metaType = XML_SCHEMA_ATTR_INFO_META_XMLNS;
23973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
23974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
23975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attr->value = value;
23976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ownedValue)
23977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
23978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attr->metaType != 0)
23979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr->state = XML_SCHEMAS_ATTR_META;
23980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
23981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
23982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
23984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaClearElemInfo:
23985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the WXS validation context
23986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ielem: the element information item
23987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
23988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
23989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearElemInfo(xmlSchemaValidCtxtPtr vctxt,
23990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaNodeInfoPtr ielem)
23991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
23992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->hasKeyrefs = 0;
23993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->appliedXPath = 0;
23994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
23995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->localName);
23996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->nsName);
23997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
23998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->localName = NULL;
23999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nsName = NULL;
24000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
24002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(ielem->value);
24003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
24004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->value = NULL;
24005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->val != NULL) {
24007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PSVI TODO: Be careful not to free it when the value is
24009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* exposed via PSVI.
24010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(ielem->val);
24012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->val = NULL;
24013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcMatchers != NULL) {
24015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* REVISIT OPTIMIZE TODO: Use a pool of IDC matchers.
24017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   Does it work?
24018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCReleaseMatcherList(vctxt, ielem->idcMatchers);
24020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
24021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeMatcherList(ielem->idcMatchers);
24022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
24023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcMatchers = NULL;
24024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->idcTable != NULL) {
24026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* OPTIMIZE TODO: Use a pool of IDC tables??.
24028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCFreeIDCTable(ielem->idcTable);
24030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->idcTable = NULL;
24031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->regexCtxt != NULL) {
24033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlRegFreeExecCtxt(ielem->regexCtxt);
24034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->regexCtxt = NULL;
24035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ielem->nsBindings != NULL) {
24037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree((xmlChar **)ielem->nsBindings);
24038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nsBindings = NULL;
24039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->nbNsBindings = 0;
24040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ielem->sizeNsBindings = 0;
24041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
24045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetFreshElemInfo:
24046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @vctxt: the schema validation context
24047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
24048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Creates/reuses and initializes the element info item for
24049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the currect tree depth.
24050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
24051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the element info item or NULL on API or internal errors.
24052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
24053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchemaNodeInfoPtr
24054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetFreshElemInfo(xmlSchemaValidCtxtPtr vctxt)
24055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr info = NULL;
24057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth > vctxt->sizeElemInfos) {
24059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaGetFreshElemInfo",
24060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "inconsistent depth encountered");
24061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (NULL);
24062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->elemInfos == NULL) {
24064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(10 * sizeof(xmlSchemaNodeInfoPtr));
24066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->elemInfos == NULL) {
24067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating the element info array", NULL);
24069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(vctxt->elemInfos, 0, 10 * sizeof(xmlSchemaNodeInfoPtr));
24072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeElemInfos = 10;
24073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->sizeElemInfos <= vctxt->depth) {
24074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i = vctxt->sizeElemInfos;
24075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeElemInfos *= 2;
24077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos = (xmlSchemaNodeInfoPtr *)
24078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRealloc(vctxt->elemInfos, vctxt->sizeElemInfos *
24079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    sizeof(xmlSchemaNodeInfoPtr));
24080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->elemInfos == NULL) {
24081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"re-allocating the element info array", NULL);
24083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We need the new memory to be NULLed.
24087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: Use memset instead?
24088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (; i < vctxt->sizeElemInfos; i++)
24090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->elemInfos[i] = NULL;
24091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = vctxt->elemInfos[vctxt->depth];
24093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (info == NULL) {
24095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = (xmlSchemaNodeInfoPtr)
24096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlMalloc(sizeof(xmlSchemaNodeInfo));
24097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (info == NULL) {
24098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaVErrMemory(vctxt,
24099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"allocating an element info", NULL);
24100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->elemInfos[vctxt->depth] = info;
24103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
24104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (info->localName != NULL) {
24105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaGetFreshElemInfo",
24106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"elem info has not been cleared");
24107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(info, 0, sizeof(xmlSchemaNodeInfo));
24111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    info->nodeType = XML_ELEMENT_NODE;
24112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    info->depth = vctxt->depth;
24113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (info);
24115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_ATTRIBUTE(item) vctxt->inode = (xmlSchemaNodeInfoPtr) item;
24118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth];
24119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ACTIVATE_PARENT_ELEM vctxt->inode = vctxt->elemInfos[vctxt->depth -1];
24120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFacets(xmlSchemaAbstractCtxtPtr actxt,
24123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodePtr node,
24124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr type,
24125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValType valType,
24126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar * value,
24127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValPtr val,
24128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			unsigned long length,
24129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int fireErrors)
24130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, error = 0;
24132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr tmpType;
24134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetLinkPtr facetLink;
24135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
24136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned long len = 0;
24137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWhitespaceValueType ws;
24138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * In Libxml2, derived built-in types have currently no explicit facets.
24141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->type == XML_SCHEMA_TYPE_BASIC)
24143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
24144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: Do not jump away, if the facetSet of the given type is
24147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * empty: until now, "pattern" and "enumeration" facets of the
24148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *base types* need to be checked as well.
24149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->facetSet == NULL)
24151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto pattern_and_enum;
24152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_ATOMIC(type)) {
24154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_LIST(type))
24155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto WXS_IS_LIST;
24156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
24157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto pattern_and_enum;
24158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Whitespace handling is only of importance for string-based
24161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * types.
24162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmpType = xmlSchemaGetPrimitiveType(type);
24164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((tmpType->builtInType == XML_SCHEMAS_STRING) ||
24165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	WXS_IS_ANY_SIMPLE_TYPE(tmpType)) {
24166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = xmlSchemaGetWhiteSpaceFacetValue(type);
24167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ws = XML_SCHEMA_WHITESPACE_COLLAPSE;
24169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * If the value was not computed (for string or
24171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * anySimpleType based types), then use the provided
24172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * type.
24173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL)
24175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valType = valType;
24176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
24177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valType = xmlSchemaGetValType(val);
2417860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
24180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (facetLink = type->facetSet; facetLink != NULL;
24181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetLink = facetLink->next) {
24182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip the pattern "whiteSpace": it is used to
24184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* format the character content beforehand.
24185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facetLink->facet->type) {
24187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_WHITESPACE:
24188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_PATTERN:
24189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_ENUMERATION:
24190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
24191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
24192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
24193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MAXLENGTH:
24194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateLengthFacetWhtsp(facetLink->facet,
24195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valType, value, val, &len, ws);
24196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
24198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateFacetWhtsp(facetLink->facet, ws,
24199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    valType, value, val, ws);
24200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
24203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaValidateFacets",
24204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating against a atomic type facet");
24205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret > 0) {
24207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (fireErrors)
24208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, len, type, facetLink->facet, NULL, NULL, NULL);
24210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectWXS_IS_LIST:
24219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (! WXS_IS_LIST(type))
24220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto pattern_and_enum;
24221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "length", "minLength" and "maxLength" of list types.
24223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
24225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (facetLink = type->facetSet; facetLink != NULL;
24226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facetLink = facetLink->next) {
2422760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (facetLink->facet->type) {
24229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_LENGTH:
24230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_FACET_MINLENGTH:
2423160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    case XML_SCHEMA_FACET_MAXLENGTH:
24232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaValidateListSimpleTypeFacet(facetLink->facet,
24233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, length, NULL);
24234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
24236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
24237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
24239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaValidateFacets",
24240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"validating against a list type facet");
24241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (ret > 0) {
2424360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (fireErrors)
24244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, length, type, facetLink->facet, NULL, NULL, NULL);
24246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectpattern_and_enum:
24255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error >= 0) {
24256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found = 0;
24257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process enumerations. Facet values are in the value space
24259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the defining type's base type. This seems to be a bug in the
24260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* XML Schema 1.0 spec. Use the whitespace type of the base type.
24261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Only the first set of enumerations in the ancestor-or-self axis
24262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* is used for validation.
24263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = 0;
24265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmpType = type;
24266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (facet = tmpType->facets; facet != NULL; facet = facet->next) {
24268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facet->type != XML_SCHEMA_FACET_ENUMERATION)
24269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
24270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 1;
24271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaAreValuesEqual(facet->val, val);
24272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == 1)
24273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (ret < 0) {
24275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaValidateFacets",
24276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating against an enumeration facet");
24277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
24278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0)
24281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Break on the first set of enumerations. Any additional
24284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  enumerations which might be existent on the ancestors
24285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  of the current type are restricted by this set; thus
24286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *  *must* *not* be taken into account.
24287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found)
24289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpType = tmpType->baseType;
24291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((tmpType != NULL) &&
24292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found && (ret == 0)) {
24294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_ENUMERATION_VALID;
24295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (fireErrors) {
24296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFacetErr(actxt, ret, node,
24297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, 0, type, NULL, NULL, NULL, NULL);
24298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
24299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (ret);
24300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (error == 0)
24301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		error = ret;
24302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (error >= 0) {
24306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int found;
24307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Process patters. Pattern facets are ORed at type level
24309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* and ANDed if derived. Walk the base type axis.
24310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	tmpType = type;
24312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	facet = NULL;
24313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 0;
24315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    for (facetLink = tmpType->facetSet; facetLink != NULL;
24316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		facetLink = facetLink->next) {
24317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (facetLink->facet->type != XML_SCHEMA_FACET_PATTERN)
24318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
24319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		found = 1;
2432060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		/*
24321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* NOTE that for patterns, @value needs to be the
24322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* normalized vaule.
24323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
24324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlRegexpExec(facetLink->facet->regexp, value);
24325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == 1)
24326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else if (ret < 0) {
24328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaValidateFacets",
24329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating against a pattern facet");
24330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
24331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
2433260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    /*
24333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * Save the last non-validating facet.
24334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
24335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    facet = facetLink->facet;
24336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (found && (ret != 1)) {
24339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_PATTERN_VALID;
24340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (fireErrors) {
24341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFacetErr(actxt, ret, node,
24342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, 0, type, facet, NULL, NULL, NULL);
24343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else
24344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (ret);
24345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (error == 0)
24346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    error = ret;
24347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpType = tmpType->baseType;
24350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while ((tmpType != NULL) && (tmpType->type != XML_SCHEMA_TYPE_BASIC));
24351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (error);
24354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2435560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
24357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNormalizeValue(xmlSchemaTypePtr type,
24358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			const xmlChar *value)
24359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2436060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    switch (xmlSchemaGetWhiteSpaceFacetValue(type)) {
24361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_WHITESPACE_COLLAPSE:
24362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaCollapseString(value));
24363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_WHITESPACE_REPLACE:
24364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (xmlSchemaWhiteSpaceReplace(value));
24365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
24366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (NULL);
24367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateQName(xmlSchemaValidCtxtPtr vctxt,
24372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       const xmlChar *value,
24373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       xmlSchemaValPtr *val,
24374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int valNeeded)
24375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
24377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
24378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *local, *prefix = NULL;
2437960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
24381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
24382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
24383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateQName",
24384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlValidateQName()");
24385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
24386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return( XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1);
24388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: xmlSplitQName2 will always return a duplicated
24391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * strings.
24392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    local = xmlSplitQName2(value, &prefix);
24394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (local == NULL)
24395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	local = xmlStrdup(value);
24396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * OPTIMIZE TODO: Use flags for:
24398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  - is there any namespace binding?
24399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *  - is there a default namespace?
24400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nsName = xmlSchemaLookupNamespace(vctxt, prefix);
2440260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prefix != NULL) {
24404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(prefix);
24405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* A namespace must be found if the prefix is
24407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOT NULL.
24408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName == NULL) {
24410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST vctxt, ret, NULL,
24412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The QName value '%s' has no "
24414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"corresponding namespace declaration in "
24415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"scope", value, NULL);
24416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (local != NULL)
24417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(local);
24418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (ret);
24419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (valNeeded && val) {
24422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nsName != NULL)
24423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = xmlSchemaNewQNameValue(
24424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST xmlStrdup(nsName), BAD_CAST local);
24425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
24426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *val = xmlSchemaNewQNameValue(NULL,
24427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST local);
24428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
24429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(local);
24430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
24431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
24434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* cvc-simple-type
24435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
24436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckCVCSimpleType(xmlSchemaAbstractCtxtPtr actxt,
24438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlNodePtr node,
24439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
24440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value,
24441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaValPtr *retVal,
24442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int fireErrors,
24443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int normalize,
24444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int isNormalized)
24445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, valNeeded = (retVal) ? 1 : 0;
24447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr val = NULL;
24448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* xmlSchemaWhitespaceValueType ws; */
24449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *normValue = NULL;
24450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NORMALIZE(atype) \
24452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! isNormalized) && \
24453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (normalize || (type->flags & XML_SCHEMAS_TYPE_NORMVALUENEEDED))) { \
24454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	normValue = xmlSchemaNormalizeValue(atype, value); \
24455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (normValue != NULL) \
24456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = normValue; \
24457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	isNormalized = 1; \
24458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2445960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
24460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((retVal != NULL) && (*retVal != NULL)) {
24461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(*retVal);
24462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*retVal = NULL;
24463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 3.14.4 Simple Type Definition Validation Rules
24466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validation Rule: String Valid
24467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 1 It is schema-valid with respect to that definition as defined
24470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * by Datatype Valid in [XML Schemas: Datatypes].
24471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.1 If The definition is ENTITY or is validly derived from ENTITY given
2447460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the empty set, as defined in Type Derivation OK (Simple) (�3.14.6), then
2447560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the string must be a �declared entity name�.
24476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.2 If The definition is ENTITIES or is validly derived from ENTITIES
2447960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * given the empty set, as defined in Type Derivation OK (Simple) (�3.14.6),
2448060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * then every whitespace-delimited substring of the string must be a �declared
2448160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * entity name�.
24482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * 2.3 otherwise no further condition applies.
24485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((! valNeeded) && (type->flags & XML_SCHEMAS_TYPE_FACETSNEEDVALUE))
24487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	valNeeded = 1;
24488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
24489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = BAD_CAST "";
24490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_ANY_SIMPLE_TYPE(type) || WXS_IS_ATOMIC(type)) {
24491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr biType; /* The built-in type. */
24492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2449360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* SPEC (1.2.1) "if {variety} is �atomic� then the string must �match�
2449460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* a literal in the �lexical space� of {base type definition}"
24495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Whitespace-normalize.
24498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NORMALIZE(type);
24500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (type->type != XML_SCHEMA_TYPE_BASIC) {
24501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get the built-in type.
24503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    biType = type->baseType;
24505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((biType != NULL) &&
24506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(biType->type != XML_SCHEMA_TYPE_BASIC))
24507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		biType = biType->baseType;
24508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (biType == NULL) {
24510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "could not get the built-in type");
24512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
24515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    biType = type;
24516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTATIONs need to be processed here, since they need
24518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* to lookup in the hashtable of NOTATION declarations of the schema.
24519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2452060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (actxt->type == XML_SCHEMA_CTXT_VALIDATOR) {
2452160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    switch (biType->builtInType) {
2452260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		case XML_SCHEMAS_NOTATION:
24523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateNotation(
24524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlSchemaValidCtxtPtr) actxt,
24525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaValidCtxtPtr) actxt)->schema,
24526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL, value, &val, valNeeded);
24527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_QNAME:
24529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateQName((xmlSchemaValidCtxtPtr) actxt,
24530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, &val, valNeeded);
24531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
24533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
24534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (valNeeded)
24535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24536df143a5041f03a22808b59c76698770b74692815Selim Gurun			    value, &val, node);
24537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
24538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24539df143a5041f03a22808b59c76698770b74692815Selim Gurun			    value, NULL, node);
24540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
2454260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	} else if (actxt->type == XML_SCHEMA_CTXT_PARSER) {
2454360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    switch (biType->builtInType) {
24544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case XML_SCHEMAS_NOTATION:
24545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidateNotation(NULL,
24546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			((xmlSchemaParserCtxtPtr) actxt)->schema, node,
24547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value, &val, valNeeded);
24548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
24549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		default:
24550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* ws = xmlSchemaGetWhiteSpaceFacetValue(type); */
24551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (valNeeded)
24552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value, &val, node);
24554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
24555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlSchemaValPredefTypeNodeNoNorm(biType,
24556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    value, NULL, node);
24557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
2455860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
24559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
24560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validation via a public API is not implemented yet.
24562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
24564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
24565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating against a built-in type");
24570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_LIST(type))
24573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
2457560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Check facets.
24580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlSchemaValType) biType->builtInType, value, val,
24583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		0, fireErrors);
24584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of atomic simple type");
24588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2459060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		if (WXS_IS_LIST(type))
24591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
2459360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1;
24594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0))
24597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_LIST(type)) {
24599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypePtr itemType;
24601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *cur, *end;
24602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *tmpValue = NULL;
24603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unsigned long len = 0;
24604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaValPtr prevVal = NULL, curVal = NULL;
2460560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/* 1.2.2 if {variety} is �list� then the string must be a sequence
2460660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* of white space separated tokens, each of which �match�es a literal
2460760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* in the �lexical space� of {item type definition}
24608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that XML_SCHEMAS_TYPE_NORMVALUENEEDED will be set if
24611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the list type has an enum or pattern facet.
24612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	NORMALIZE(type);
24614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Optimize validation of empty values.
24616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: We do not have computed values for lists.
24617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2461860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	itemType = WXS_LIST_ITEMTYPE(type);
24619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = value;
24620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
24621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while (IS_BLANK_CH(*cur))
24622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		cur++;
24623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    end = cur;
24624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    while ((*end != 0) && (!(IS_BLANK_CH(*end))))
24625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		end++;
24626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (end == cur)
24627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpValue = xmlStrndup(cur, end - cur);
24629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len++;
24630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (valNeeded)
24632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
24633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmpValue, &curVal, fireErrors, 0, 1);
24634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node, itemType,
24636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    tmpValue, NULL, fireErrors, 0, 1);
24637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(tmpValue);
24638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (curVal != NULL) {
24639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
24640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Add to list of computed values.
24641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
24642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (val == NULL)
24643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    val = curVal;
24644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
24645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaValueAppend(prevVal, curVal);
24646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		prevVal = curVal;
24647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		curVal = NULL;
24648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating an item of list simple type");
24653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
2465760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
24658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = end;
24659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (*cur != 0);
24660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(tmpValue);
24661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Apply facets (pattern, enumeration).
24664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_UNKNOWN, value, val,
24667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		len, fireErrors);
24668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of list simple type");
24672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
24674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_2;
24675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0)) {
2467860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
24679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Report the normalized value.
24680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    normalize = 1;
24682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NORMALIZE(type);
24683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_IS_UNION(type)) {
24686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaTypeLinkPtr memberLink;
24687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2468860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* TODO: For all datatypes �derived� by �union�  whiteSpace does
2468960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* not apply directly; however, the normalization behavior of �union�
24690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* types is controlled by the value of whiteSpace on that one of the
2469160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �memberTypes� against which the �union� is successfully validated.
24692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
24693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This means that the value is normalized by the first validating
24694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* member type, then the facets of the union type are applied. This
24695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* needs changing of the value!
24696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2469960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 1.2.3 if {variety} is �union� then the string must �match� a
2470060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* literal in the �lexical space� of at least one member of
24701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* {member type definitions}
24702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memberLink = xmlSchemaGetUnionSimpleTypeMemberTypes(type);
24704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (memberLink == NULL) {
24705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"union simple type has no member types");
24707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
2470860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
24709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Always normalize union type values, since we currently
24711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cannot store the whitespace information with the value
24712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* itself; otherwise a later value-comparison would be
24713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* not possible.
24714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (memberLink != NULL) {
2471660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (valNeeded)
24717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
24718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memberLink->type, value, &val, 0, 1, 0);
24719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
24720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaVCheckCVCSimpleType(actxt, node,
24721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    memberLink->type, value, NULL, 0, 1, 0);
24722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret <= 0)
24723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
24724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    memberLink = memberLink->next;
24725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating members of union simple type");
24730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
24733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Apply facets (pattern, enumeration).
24736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((ret == 0) && (type->flags & XML_SCHEMAS_TYPE_HAS_FACETS)) {
24738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2473960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * The normalization behavior of �union� types is controlled by
2474060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the value of whiteSpace on that one of the �memberTypes�
2474160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * against which the �union� is successfully validated.
24742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NORMALIZE(memberLink->type);
24744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateFacets(actxt, node, type,
24745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAS_UNKNOWN, value, val,
24746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		0, fireErrors);
24747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
24748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
24749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    AERROR_INT("xmlSchemaVCheckCVCSimpleType",
24750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"validating facets of union simple type");
24751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
24752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2475360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		ret = XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_3;
24754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (fireErrors && (ret > 0))
24757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaSimpleTypeErr(actxt, ret, node, value, type, 1);
24758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normValue != NULL)
24761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(normValue);
24762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
24763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (retVal != NULL)
24764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *retVal = val;
24765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else if (val != NULL)
24766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(val);
24767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (val != NULL)
24768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(val);
24769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
24770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
24771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (normValue != NULL)
24772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(normValue);
24773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val != NULL)
24774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(val);
24775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
24776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVExpandQName(xmlSchemaValidCtxtPtr vctxt,
24780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar *value,
24781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **nsName,
24782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   const xmlChar **localName)
24783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
24785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((nsName == NULL) || (localName == NULL))
24787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *nsName = NULL;
24789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *localName = NULL;
24790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlValidateQName(value, 1);
24792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1)
24793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0) {
24795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSimpleTypeErr(ACTXT_CAST vctxt,
24796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
24797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value, xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME), 1);
24798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
24799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
24801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *local = NULL;
24802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *prefix;
24803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: xmlSplitQName2 will return a duplicated
24806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* string.
24807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	local = xmlSplitQName2(value, &prefix);
24809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (local == NULL)
24810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *localName = xmlDictLookup(vctxt->dict, value, -1);
24811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
24812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *localName = xmlDictLookup(vctxt->dict, local, -1);
24813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(local);
24814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*nsName = xmlSchemaLookupNamespace(vctxt, prefix);
24817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (prefix != NULL) {
24819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(prefix);
24820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * A namespace must be found if the prefix is NOT NULL.
24822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (*nsName == NULL) {
24824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
24825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_DATATYPE_VALID_1_2_1, NULL,
24826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The QName value '%s' has no "
24828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "corresponding namespace declaration in scope",
24829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value, NULL);
24830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (2);
24831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
24835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaProcessXSIType(xmlSchemaValidCtxtPtr vctxt,
24839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaAttrInfoPtr iattr,
24840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaTypePtr *localType,
24841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaElementPtr elemDecl)
24842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
24844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : (4)
24846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
24847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema-Validity Assessment (Element) (cvc-assess-elt)
24848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   (1.2.1.2.1) - (1.2.1.2.4)
24849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle 'xsi:type'.
24850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (localType == NULL)
24852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
24853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *localType = NULL;
24854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (iattr == NULL)
24855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
24856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
24857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const xmlChar *nsName = NULL, *local = NULL;
24858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: We should report a *warning* that the type was overriden
24860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* by the instance.
24861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
24863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-elt) (3.3.4) : (4.1)
24865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-assess-elt) (1.2.1.2.2)
24866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVExpandQName(vctxt, iattr->value,
24868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    &nsName, &local);
24869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
24870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
24871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElementByDeclaration",
24872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaQNameExpand() to validate the "
24873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "attribute 'xsi:type'");
24874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
24875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
24877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-elt) (3.3.4) : (4.2)
24880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (cvc-assess-elt) (1.2.1.2.3)
24881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
24882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*localType = xmlSchemaGetType(vctxt->schema, local, nsName);
24883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*localType == NULL) {
24884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *str = NULL;
24885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaCustomErr(ACTXT_CAST vctxt,
24887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAV_CVC_ELT_4_2, NULL,
24888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		WXS_BASIC_CAST xmlSchemaGetBuiltInType(XML_SCHEMAS_QNAME),
24889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"The QName value '%s' of the xsi:type attribute does not "
24890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"resolve to a type definition",
24891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str, nsName, local), NULL);
24892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    FREE_AND_NULL(str);
24893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = vctxt->err;
24894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
24895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (elemDecl != NULL) {
24897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int set = 0;
24898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC cvc-elt (3.3.4) : (4.3) (Type Derivation OK)
2490160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "The �local type definition� must be validly
24902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * derived from the {type definition} given the union of
24903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {disallowed substitutions} and the {type definition}'s
24904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {prohibited substitutions}, as defined in
2490560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Type Derivation OK (Complex) (�3.4.6)
24906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (if it is a complex type definition),
24907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * or given {disallowed substitutions} as defined in Type
2490860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Derivation OK (Simple) (�3.14.6) (if it is a simple type
24909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition)."
24910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
24911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {disallowed substitutions}: the "block" on the element decl.
24912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {prohibited substitutions}: the "block" on the type def.
24913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * OPTIMIZE TODO: We could map types already evaluated
24916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to be validly derived from other types to avoid checking
24917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * this over and over for the same types.
24918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_EXTENSION) ||
24920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(elemDecl->subtypes->flags &
24921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_BLOCK_EXTENSION))
24922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_EXTENSION;
24923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((elemDecl->flags & XML_SCHEMAS_ELEM_BLOCK_RESTRICTION) ||
24925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(elemDecl->subtypes->flags &
24926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_TYPE_BLOCK_RESTRICTION))
24927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		set |= SUBSET_RESTRICTION;
24928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
24930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * REMOVED and CHANGED since this produced a parser context
24931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * which adds to the string dict of the schema. So this would
24932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * change the schema and we don't want this. We don't need
24933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the parser context anymore.
24934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
24935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if ((vctxt->pctxt == NULL) &&
24936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	(xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
24937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *	    return (-1);
24938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
24939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCOSDerivedOK(ACTXT_CAST vctxt, *localType,
24941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl->subtypes, set) != 0) {
24942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *str = NULL;
24943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
24945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_ELT_4_3, NULL, NULL,
24946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition '%s', specified by xsi:type, is "
24947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "blocked or not validly derived from the type definition "
24948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "of the element declaration",
24949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str,
24950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(*localType)->targetNamespace,
24951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(*localType)->name),
24952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    NULL);
24953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		FREE_AND_NULL(str);
24954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = vctxt->err;
24955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*localType = NULL;
24956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
24957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
24958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
24960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
24961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
24962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
24963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
24964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
24965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
24968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElemDecl(xmlSchemaValidCtxtPtr vctxt)
24969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
24970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaElementPtr elemDecl = vctxt->inode->decl;
24971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr actualType;
24972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
24973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : 1
24975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl == NULL) {
24977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL,
24978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No matching declaration available");
24979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (vctxt->err);
24980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    actualType = WXS_ELEM_TYPEDEF(elemDecl);
24982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
24983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cvc-elt (3.3.4) : 2
24984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
24985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elemDecl->flags & XML_SCHEMAS_ELEM_ABSTRACT) {
24986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_2, NULL,
24987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The element declaration is abstract");
24988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (vctxt->err);
24989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actualType == NULL) {
24991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
24992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	    "The type definition is absent");
24993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	return (XML_SCHEMAV_CVC_TYPE_1);
24994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
24995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
24996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int ret;
24997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
24998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
24999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cvc-elt (3.3.4) : 3
25000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Handle 'xsi:nil'.
25001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_NIL);
25004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr) {
25005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ATTRIBUTE(iattr);
25006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the value.
25008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckCVCSimpleType(
25010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt, NULL,
25011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaGetBuiltInType(XML_SCHEMAS_BOOLEAN),
25012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->value, &(iattr->val), 1, 0, 0);
25013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM;
25014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
25015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElemDecl",
25016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType() to "
25017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validate the attribute 'xsi:nil'");
25018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 0) {
25021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((elemDecl->flags & XML_SCHEMAS_ELEM_NILLABLE) == 0) {
25022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * cvc-elt (3.3.4) : 3.1
25024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR(XML_SCHEMAV_CVC_ELT_3_1, NULL,
25026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The element is not 'nillable'");
25027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* Does not return an error on purpose. */
25028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaValueGetAsBoolean(iattr->val)) {
25030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* cvc-elt (3.3.4) : 3.2.2
25032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((elemDecl->flags & XML_SCHEMAS_ELEM_FIXED) &&
25034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    (elemDecl->value != NULL)) {
25035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    VERROR(XML_SCHEMAV_CVC_ELT_3_2_2, NULL,
25036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"The element cannot be 'nilled' because "
25037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"there is a fixed value constraint defined "
25038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"for it");
25039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     /* Does not return an error on purpose. */
25040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} else
25041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    vctxt->inode->flags |=
25042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				XML_SCHEMA_ELEM_INFO_NILLED;
25043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* cvc-elt (3.3.4) : 4
25049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Handle 'xsi:type'.
25050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr) {
25054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaTypePtr localType = NULL;
25055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaProcessXSIType(vctxt, iattr, &localType,
25057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		elemDecl);
25058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
25059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
25060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidateElemDecl",
25061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaProcessXSIType() to "
25062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"process the attribute 'xsi:type'");
25063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
25064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* Does not return an error on purpose. */
25066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (localType != NULL) {
25068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |= XML_SCHEMA_ELEM_INFO_LOCAL_TYPE;
25069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		actualType = localType;
25070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * IDC: Register identity-constraint XPath matchers.
25075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((elemDecl->idcs != NULL) &&
25077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaIDCRegisterMatchers(vctxt, elemDecl) == -1))
25078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
25079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * No actual type definition.
25081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (actualType == NULL) {
25083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	VERROR(XML_SCHEMAV_CVC_TYPE_1, NULL,
25084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	    "The type definition is absent");
25085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	return (XML_SCHEMAV_CVC_TYPE_1);
25086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Remember the actual type definition.
25089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->typeDef = actualType;
25091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAttributesSimple(xmlSchemaValidCtxtPtr vctxt)
25097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr iattr;
25099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i;
25100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC cvc-type (3.1.1)
25103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * "The attributes of must be empty, excepting those whose namespace
25104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * name is identical to http://www.w3.org/2001/XMLSchema-instance and
25105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * whose local name is one of type, nil, schemaLocation or
25106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * noNamespaceSchemaLocation."
25107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (! iattr->metaType) {
25113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ATTRIBUTE(iattr)
25114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMAV_CVC_TYPE_3_1_1, iattr, NULL);
25116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_TYPE_3_1_1;
25117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
25118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM
25120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
25121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Cleanup currently used attribute infos.
25125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
25127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearAttrInfos(xmlSchemaValidCtxtPtr vctxt)
25128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
25130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttrInfoPtr attr;
25131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
25134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attr = vctxt->attrInfos[i];
25136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES) {
25137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->localName != NULL)
25138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->localName);
25139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->nsName != NULL)
25140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->nsName);
25141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
25143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (attr->value != NULL)
25144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree((xmlChar *) attr->value);
25145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attr->val != NULL) {
25147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(attr->val);
25148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr->val = NULL;
25149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	memset(attr, 0, sizeof(xmlSchemaAttrInfo));
25151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nbAttrInfos = 0;
25153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.4.4 Complex Type Definition Validation Rules
25157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Element Locally Valid (Complex Type) (cvc-complex-type)
25158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.2.4 Attribute Declaration Validation Rules
25159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Validation Rule: Attribute Locally Valid (cvc-attribute)
25160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*   Attribute Locally Valid (Use) (cvc-au)
25161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
25162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Only "assessed" attribute information items will be visible to
25163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* IDCs. I.e. not "lax" (without declaration) and "skip" wild attributes.
25164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVAttributesComplex(xmlSchemaValidCtxtPtr vctxt)
25167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2516860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaTypePtr type = vctxt->inode->typeDef;
25169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListPtr attrUseList;
25170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributeUsePtr attrUse = NULL;
25171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaAttributePtr attrDecl = NULL;
2517260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    xmlSchemaAttrInfoPtr iattr, tmpiattr;
25173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, found, nbAttrs, nbUses;
25174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int xpathRes = 0, res, wildIDs = 0, fixed;
25175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr defAttrOwnerElem = NULL;
25176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (cvc-attribute)
2517960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * (1) "The declaration must not be �absent� (see Missing
2518060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Sub-components (�5.3) for how this can fail to be
25181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * the case)."
25182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (2) "Its {type definition} must not be absent."
25183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE (1) + (2): This is not handled here, since we currently do not
25185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * allow validation against schemas which have missing sub-components.
25186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (cvc-complex-type)
25188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * (3) "For each attribute information item in the element information
25189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * item's [attributes] excepting those whose [namespace name] is
25190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * identical to http://www.w3.org/2001/XMLSchema-instance and whose
25191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * [local name] is one of type, nil, schemaLocation or
25192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * noNamespaceSchemaLocation, the appropriate case among the following
25193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * must be true:
25194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrUseList = (xmlSchemaItemListPtr) type->attrUses;
25197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * @nbAttrs is the number of attributes present in the instance.
25199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nbAttrs = vctxt->nbAttrInfos;
25201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (attrUseList != NULL)
25202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbUses = attrUseList->nbItems;
25203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
25204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nbUses = 0;
25205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbUses; i++) {
25206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        found = 0;
25207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrUse = attrUseList->items[i];
25208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	attrDecl = WXS_ATTRUSE_DECL(attrUse);
25209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < nbAttrs; j++) {
25210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[j];
25211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (3)
25213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip meta attributes.
25214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->metaType)
25216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->localName[0] != attrDecl->name[0])
25218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!xmlStrEqual(iattr->localName, attrDecl->name))
25220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (!xmlStrEqual(iattr->nsName, attrDecl->targetNamespace))
25222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    found = 1;
25224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
25226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1) "If there is among the {attribute uses} an attribute
25227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * use with an {attribute declaration} whose {name} matches
25228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the attribute information item's [local name] and whose
25229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * {target namespace} is identical to the attribute information
2523060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * item's [namespace name] (where an �absent� {target namespace}
25231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * is taken to be identical to a [namespace name] with no value),
2523260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * then the attribute information must be �valid� with respect
25233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * to that attribute use as per Attribute Locally Valid (Use)
2523460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (�3.5.4). In this case the {attribute declaration} of that
2523560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * attribute use is the �context-determined declaration� for the
25236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * attribute information item with respect to Schema-Validity
2523760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Assessment (Attribute) (�3.2.4) and
2523860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Assessment Outcome (Attribute) (�3.2.5).
25239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->use = attrUse;
25242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Context-determined declaration.
25244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->decl = attrDecl;
25246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->typeDef = attrDecl->subtypes;
25247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
25248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (found)
25251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (attrUse->occurs == XML_SCHEMAS_ATTR_USE_REQUIRED) {
25254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Handle non-existent, required attributes.
25256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
25258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (4) "The {attribute declaration} of each attribute use in
25259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {attribute uses} whose {required} is true matches one
25260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * of the attribute information items in the element information
25261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * item's [attributes] as per clause 3.1 above."
25262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpiattr == NULL) {
25265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT(
25266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaVAttributesComplex",
25267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaGetFreshAttrInfo()");
25268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->state = XML_SCHEMAS_ATTR_ERR_MISSING;
25271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->use = attrUse;
2527260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    tmpiattr->decl = attrDecl;
25273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((attrUse->occurs == XML_SCHEMAS_ATTR_USE_OPTIONAL) &&
25274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((attrUse->defValue != NULL) ||
25275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (attrDecl->defValue != NULL))) {
25276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Handle non-existent, optional, default/fixed attributes.
25278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr = xmlSchemaGetFreshAttrInfo(vctxt);
25280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (tmpiattr == NULL) {
25281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT(
25282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "xmlSchemaVAttributesComplex",
25283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaGetFreshAttrInfo()");
25284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->state = XML_SCHEMAS_ATTR_DEFAULT;
25287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->use = attrUse;
25288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->decl = attrDecl;
25289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->typeDef = attrDecl->subtypes;
25290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->localName = attrDecl->name;
25291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmpiattr->nsName = attrDecl->targetNamespace;
25292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the wildcard.
25299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type->attributeWildcard != NULL) {
25301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-complex-type)
25303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (3.2.1) "There must be an {attribute wildcard}."
25304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < nbAttrs; i++) {
25306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = vctxt->attrInfos[i];
25307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (3)
25309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Skip meta attributes.
25310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->state != XML_SCHEMAS_ATTR_UNKNOWN)
25312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		continue;
25313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type)
2531560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (3.2.2) "The attribute information item must be �valid� with
2531660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * respect to it as defined in Item Valid (Wildcard) (�3.10.4)."
25317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Item Valid (Wildcard) (cvc-wildcard)
2531960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "... its [namespace name] must be �valid� with respect to
25320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the wildcard constraint, as defined in Wildcard allows
2532160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Namespace Name (�3.10.4)."
25322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaCheckCVCWildcardNamespace(type->attributeWildcard,
25324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->nsName) == 0) {
25325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle processContents.
25327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*
25328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-wildcard):
25329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* processContents | context-determined declaration:
25330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "strict"          "mustFind"
25331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "lax"             "none"
25332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "skip"            "skip"
25333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attributeWildcard->processContents ==
25335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ANY_SKIP) {
25336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     /*
25337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * context-determined declaration = "skip"
25338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
25339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC PSVI Assessment Outcome (Attribute)
25340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validity] = "notKnown"
25341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validation attempted] = "none"
25342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_WILD_SKIP;
25344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    continue;
25345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Find an attribute declaration.
25348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->decl = xmlSchemaGetAttributeDecl(vctxt->schema,
25350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->localName, iattr->nsName);
25351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->decl != NULL) {
25352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ASSESSED;
25353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC (cvc-complex-type)
25355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * (5) "Let [Definition:]  the wild IDs be the set of
25356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * all attribute information item to which clause 3.2
2535760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * applied and whose �validation� resulted in a
2535860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * �context-determined declaration� of mustFind or no
2535960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * �context-determined declaration� at all, and whose
25360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [local name] and [namespace name] resolve (as
2536160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * defined by QName resolution (Instance) (�3.15.4)) to
25362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * an attribute declaration whose {type definition} is
25363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * or is derived from ID. Then all of the following
25364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * must be true:"
25365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->typeDef = WXS_ATTR_TYPEDEF(iattr->decl);
25367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaIsDerivedFromBuiltInType(
25368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			iattr->typeDef, XML_SCHEMAS_ID)) {
25369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (5.1) "There must be no more than one
2537160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* item in �wild IDs�."
25372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (wildIDs != 0) {
25374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    /* VAL TODO */
25375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID;
25376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    TODO
25377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    continue;
25378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			}
25379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			wildIDs++;
25380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* SPEC (cvc-complex-type)
2538260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			* (5.2) "If �wild IDs� is non-empty, there must not
25383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* be any attribute uses among the {attribute uses}
25384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* whose {attribute declaration}'s {type definition}
25385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* is or is derived from ID."
25386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25387df143a5041f03a22808b59c76698770b74692815Selim Gurun                        if (attrUseList != NULL) {
25388df143a5041f03a22808b59c76698770b74692815Selim Gurun                            for (j = 0; j < attrUseList->nbItems; j++) {
25389df143a5041f03a22808b59c76698770b74692815Selim Gurun                                if (xmlSchemaIsDerivedFromBuiltInType(
25390df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    WXS_ATTRUSE_TYPEDEF(attrUseList->items[j]),
25391df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    XML_SCHEMAS_ID)) {
25392df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    /* URGENT VAL TODO: implement */
25393df143a5041f03a22808b59c76698770b74692815Selim Gurun                            iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID;
25394df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    TODO
25395df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    break;
25396df143a5041f03a22808b59c76698770b74692815Selim Gurun                                }
25397df143a5041f03a22808b59c76698770b74692815Selim Gurun                            }
25398df143a5041f03a22808b59c76698770b74692815Selim Gurun                        }
25399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (type->attributeWildcard->processContents ==
25401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAS_ANY_LAX) {
25402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL;
25403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * SPEC PSVI Assessment Outcome (Attribute)
25405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validity] = "notKnown"
25406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * [validation attempted] = "none"
25407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL;
25410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos == 0)
25416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Get the owner element; needed for creation of default attributes.
25420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * This fixes bug #341337, reported by David Grohmann.
25421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) {
25423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ielem = vctxt->elemInfos[vctxt->depth];
25424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ielem && ielem->node && ielem->node->doc)
25425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    defAttrOwnerElem = ielem->node;
25426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate values, create default attributes, evaluate IDCs.
25429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Note that we won't try to resolve IDCs to
25434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "lax" and "skip" validated attributes. Check what to
25435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* do in this case.
25436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->state != XML_SCHEMAS_ATTR_ASSESSED) &&
25438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state != XML_SCHEMAS_ATTR_DEFAULT))
25439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: What to do if the type definition is missing?
25442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->typeDef == NULL) {
25444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_ERR_NO_TYPE;
25445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
25449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	fixed = 0;
25450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xpathRes = 0;
25451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->xpathStates != NULL) {
25453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Evaluate IDCs.
25455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xpathRes = xmlSchemaXPathEvaluate(vctxt,
25457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_ATTRIBUTE_NODE);
25458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xpathRes == -1) {
25459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaXPathEvaluate()");
25461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr->state == XML_SCHEMAS_ATTR_DEFAULT) {
25466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Default/fixed attributes.
25468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * We need the value only if we need to resolve IDCs or
25469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * will create default attributes.
25470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((xpathRes) || (defAttrOwnerElem)) {
25472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->use->defValue != NULL) {
25473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value = (xmlChar *) iattr->use->defValue;
25474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->val = iattr->use->defVal;
25475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value = (xmlChar *) iattr->decl->defValue;
25477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->val = iattr->decl->defVal;
25478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* IDCs will consume the precomputed default value,
25481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* so we need to clone it.
25482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->val == NULL) {
25484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVAttributesComplex",
25485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"default/fixed value on an attribute use was "
25486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"not precomputed");
25487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
25488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->val = xmlSchemaCopyValue(iattr->val);
25490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->val == NULL) {
25491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVAttributesComplex",
25492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaCopyValue()");
25493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
25494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * PSVI: Add the default attribute to the current element.
25498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: Should we use the *normalized* value? This currently
25499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *   uses the *initial* value.
25500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
2550160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
25502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (defAttrOwnerElem) {
25503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *normValue;
25504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *value;
25505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value = iattr->value;
25507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Normalize the value.
25509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		normValue = xmlSchemaNormalizeValue(iattr->typeDef,
25511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->value);
25512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normValue != NULL)
25513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    value = BAD_CAST normValue;
25514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->nsName == NULL) {
25516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlNewProp(defAttrOwnerElem,
25517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			iattr->localName, value) == NULL) {
25518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVAttributesComplex",
25519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "callling xmlNewProp()");
25520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (normValue != NULL)
25521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    xmlFree(normValue);
25522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
25523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNsPtr ns;
25526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ns = xmlSearchNsByHref(defAttrOwnerElem->doc,
25528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			defAttrOwnerElem, iattr->nsName);
25529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ns == NULL) {
25530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlChar prefix[12];
25531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			int counter = 0;
25532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
25534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Create a namespace declaration on the validation
25535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* root node if no namespace declaration is in scope.
25536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
25537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			do {
25538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    snprintf((char *) prefix, 12, "p%d", counter++);
25539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ns = xmlSearchNs(defAttrOwnerElem->doc,
25540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				defAttrOwnerElem, BAD_CAST prefix);
25541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    if (counter > 1000) {
25542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				VERROR_INT(
25543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "xmlSchemaVAttributesComplex",
25544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "could not compute a ns prefix for a "
25545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    "default/fixed attribute");
25546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (normValue != NULL)
25547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlFree(normValue);
25548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				goto internal_error;
25549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    }
25550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			} while (ns != NULL);
25551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ns = xmlNewNs(vctxt->validationRoot,
25552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->nsName, BAD_CAST prefix);
25553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
25554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
25555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * TODO:
25556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * http://lists.w3.org/Archives/Public/www-xml-schema-comments/2005JulSep/0406.html
25557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * If we have QNames: do we need to ensure there's a
25558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * prefix defined for the QName?
25559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
25560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlNewNsProp(defAttrOwnerElem, ns, iattr->localName, value);
25561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (normValue != NULL)
25563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(normValue);
25564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Go directly to IDC evaluation.
25567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto eval_idcs;
25569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Validate the value.
25572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->value != NULL) {
25574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Free last computed value; just for safety reasons.
25576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(vctxt->value);
25578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->value = NULL;
25579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that the attribute *use* can be unavailable, if
25582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* the attribute was a wild attribute.
25583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->decl->flags & XML_SCHEMAS_ATTR_FIXED) ||
25585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((iattr->use != NULL) &&
25586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (iattr->use->flags & XML_SCHEMAS_ATTR_FIXED)))
25587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = 1;
25588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
25589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    fixed = 0;
25590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-attribute)
2559260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (3) "The item's �normalized value� must be locally �valid�
2559360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* with respect to that {type definition} as per
2559460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* String Valid (�3.14.4)."
25595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* VAL TODO: Do we already have the
25597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "normalized attribute value" here?
25598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xpathRes || fixed) {
25600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->flags |= XML_SCHEMA_NODE_INFO_VALUE_NEEDED;
25601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Request a computed value.
25603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaVCheckCVCSimpleType(
25605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt,
25606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->node, iattr->typeDef, iattr->value, &(iattr->val),
25607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		1, 1, 0);
25608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
25609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    res = xmlSchemaVCheckCVCSimpleType(
25610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ACTXT_CAST vctxt,
25611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->node, iattr->typeDef, iattr->value, NULL,
25612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		1, 0, 0);
25613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2561460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
25615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res != 0) {
25616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (res == -1) {
25617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaStreamValidateSimpleTypeValue()");
25619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr->state = XML_SCHEMAS_ATTR_INVALID_VALUE;
25622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC PSVI Assessment Outcome (Attribute)
25624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [validity] = "invalid"
25625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto eval_idcs;
25627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2562960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (fixed) {
25630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Attribute Locally Valid (Use) (cvc-au)
2563260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "For an attribute information item to be�valid�
25633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * with respect to an attribute use its *normalized*
2563460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * value� must match the *canonical* lexical
25635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * representation of the attribute use's {value
25636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * constraint}value, if it is present and fixed."
25637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
25638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: The requirement for the *canonical* value
25639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * will be removed in XML Schema 1.1.
25640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC Attribute Locally Valid (cvc-attribute)
2564360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (4) "The item's *actual* value� must match the *value* of
25644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * the {value constraint}, if it is present and fixed."
25645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr->val == NULL) {
25647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/* VAL TODO: A value was not precomputed. */
25648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		TODO
25649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto eval_idcs;
25650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((iattr->use != NULL) &&
25652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(iattr->use->defValue != NULL)) {
25653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->use->defVal == NULL) {
25654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* VAL TODO: A default value was not precomputed. */
25655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
25656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto eval_idcs;
25657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->vcValue = iattr->use->defValue;
25659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaCompareValuesWhtsp(attr->val,
25661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws,
25662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr->use->defVal,
25663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws) != 0) {
25664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->use->defVal))
25666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
25668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->decl->defVal == NULL) {
25669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /* VAL TODO: A default value was not precomputed. */
25670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    TODO
25671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto eval_idcs;
25672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		iattr->vcValue = iattr->decl->defValue;
25674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (xmlSchemaCompareValuesWhtsp(attr->val,
25676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws,
25677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attrDecl->defVal,
25678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlSchemaWhitespaceValueType) ws) != 0) {
25679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (! xmlSchemaAreValuesEqual(iattr->val, iattr->decl->defVal))
25681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    iattr->state = XML_SCHEMAS_ATTR_ERR_FIXED_VALUE;
25682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * [validity] = "valid"
25685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecteval_idcs:
25688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Evaluate IDCs.
25690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xpathRes) {
25692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaXPathProcessHistory(vctxt,
25693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->depth +1) == -1) {
25694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVAttributesComplex",
25695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaXPathEvaluate()");
25696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
25697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (vctxt->xpathStates != NULL)
25699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaXPathPop(vctxt);
25700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Report errors.
25704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < vctxt->nbAttrInfos; i++) {
25706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = vctxt->attrInfos[i];
25707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((iattr->state == XML_SCHEMAS_ATTR_META) ||
25708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_ASSESSED) ||
25709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_WILD_SKIP) ||
25710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (iattr->state == XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL))
25711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
25712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ATTRIBUTE(iattr);
25713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (iattr->state) {
25714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_MISSING: {
25715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlChar *str = NULL;
25716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ACTIVATE_ELEM;
25717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaCustomErr(ACTXT_CAST vctxt,
25718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_4, NULL, NULL,
25719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"The attribute '%s' is required but missing",
25720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaFormatQName(&str,
25721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->decl->targetNamespace,
25722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    iattr->decl->name),
25723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
25724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    FREE_AND_NULL(str)
25725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
25726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_NO_TYPE:
25728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_ATTRIBUTE_2, NULL,
25729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The type definition is absent");
25730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_FIXED_VALUE:
25732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaCustomErr(ACTXT_CAST vctxt,
25733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_CVC_AU, NULL, NULL,
25734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The value '%s' does not match the fixed "
2573560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    "value constraint '%s'",
2573660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    iattr->value, iattr->vcValue);
25737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL:
25739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(XML_SCHEMAV_CVC_WILDCARD, NULL,
25740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "No matching global attribute declaration available, but "
25741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "demanded by the strict wildcard");
25742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMAS_ATTR_UNKNOWN:
25744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (iattr->metaType)
25745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    break;
25746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
25747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* MAYBE VAL TODO: One might report different error messages
25748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* for the following errors.
25749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
25750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (type->attributeWildcard == NULL) {
25751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_1, iattr, NULL);
25753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
25754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaIllegalAttrErr(ACTXT_CAST vctxt,
25755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			XML_SCHEMAV_CVC_COMPLEX_TYPE_3_2_2, iattr, NULL);
25756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
25757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
25759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
25760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
25764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
25766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ACTIVATE_ELEM;
25767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
25768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElemWildcard(xmlSchemaValidCtxtPtr vctxt,
25772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      int *skip)
25773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaWildcardPtr wild = (xmlSchemaWildcardPtr) vctxt->inode->decl;
25775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The namespace of the element was already identified to be
25777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * matching the wildcard.
25778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((skip == NULL) || (wild == NULL) ||
25780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(wild->type != XML_SCHEMA_TYPE_ANY)) {
25781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElemWildcard",
25782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "bad arguments");
25783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
25784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *skip = 0;
25786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->processContents == XML_SCHEMAS_ANY_SKIP) {
25787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* URGENT VAL TODO: Either we need to position the stream to the
25789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* next sibling, or walk the whole subtree.
25790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*skip = 1;
25792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
25793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
25795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaElementPtr decl = NULL;
25796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	decl = xmlSchemaGetElem(vctxt->schema,
2579860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    vctxt->inode->localName, vctxt->inode->nsName);
25799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (decl != NULL) {
25800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->decl = decl;
25801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
25802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (wild->processContents == XML_SCHEMAS_ANY_STRICT) {
25805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* VAL TODO: Change to proper error code. */
25806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_1, NULL, /* WXS_BASIC_CAST wild */
25807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "No matching global element declaration available, but "
25808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "demanded by the strict wildcard");
25809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
25810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
25812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr iattr;
25813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC Validation Rule: Schema-Validity Assessment (Element)
25815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* (1.2.1.2.1) - (1.2.1.2.3 )
25816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Use the xsi:type attribute for the type definition.
25818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	iattr = xmlSchemaGetMetaAttrInfo(vctxt,
25820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
25821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (iattr != NULL) {
25822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaProcessXSIType(vctxt, iattr,
25823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&(vctxt->inode->typeDef), NULL) == -1) {
25824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElemWildcard",
25825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaProcessXSIType() to "
25826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "process the attribute 'xsi:nil'");
25827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
25828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
25829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
25830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Don't return an error on purpose.
25831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
25832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (0);
25833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC Validation Rule: Schema-Validity Assessment (Element)
25837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Fallback to "anyType".
25839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
25840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->typeDef =
25841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
25842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
25846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* xmlSchemaCheckCOSValidDefault:
25847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*
25848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* This will be called if: not nilled, no content and a default/fixed
25849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* value is provided.
25850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaCheckCOSValidDefault(xmlSchemaValidCtxtPtr vctxt,
25854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      const xmlChar *value,
25855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			      xmlSchemaValPtr *val)
2585660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
25857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
25858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode = vctxt->inode;
25859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
25861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * cos-valid-default:
25862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Schema Component Constraint: Element Default Valid (Immediate)
2586360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * For a string to be a valid default with respect to a type
25864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * definition the appropriate case among the following must be true:
2586560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
25866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if WXS_IS_COMPLEX(inode->typeDef) {
25867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Complex type.
25869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
25870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.1) "its {content type} must be a simple type definition
25871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* or mixed."
25872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (2.2.2) "If the {content type} is mixed, then the {content
2587360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* type}'s particle must be �emptiable� as defined by
2587460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Particle Emptiable (�3.9.6)."
25875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((! WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) &&
25877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ((! WXS_HAS_MIXED_CONTENT(inode->typeDef)) ||
25878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     (! WXS_EMPTIABLE(inode->typeDef)))) {
25879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAP_COS_VALID_DEFAULT_2_1;
25880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* NOTE that this covers (2.2.2) as well. */
25881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
25882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"For a string to be a valid default, the type definition "
25883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"must be a simple type or a complex type with simple content "
25884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"or mixed content and a particle emptiable");
25885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
25886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2588760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2588960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 1 If the type definition is a simple type definition, then the string
2589060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * must be �valid� with respect to that definition as defined by String
2589160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Valid (�3.14.4).
25892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
25893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * AND
25894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
2589560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * 2.2.1 If the {content type} is a simple type definition, then the
2589660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * string must be �valid� with respect to that simple type definition
2589760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * as defined by String Valid (�3.14.4).
2589860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
25899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_SIMPLE(inode->typeDef)) {
25900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, inode->typeDef, value, val, 1, 1, 0);
25903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
25905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVCheckCVCSimpleType(ACTXT_CAST vctxt,
25907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    NULL, inode->typeDef->contentTypeDef, value, val, 1, 1, 0);
25908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
25910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaCheckCOSValidDefault",
25911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVCheckCVCSimpleType()");
2591260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
25914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
25917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVContentModelCallback(xmlSchemaValidCtxtPtr vctxt ATTRIBUTE_UNUSED,
25918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * name ATTRIBUTE_UNUSED,
25919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaElementPtr item,
25920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       xmlSchemaNodeInfoPtr inode)
25921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inode->decl = item;
25923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_CONTENT
25924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
25925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *str = NULL;
25926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (item->type == XML_SCHEMA_TYPE_ELEMENT) {
25928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
25929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON callback for '%s' [declaration]\n",
25930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaFormatQName(&str,
25931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->localName, inode->nsName));
25932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
25933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlGenericError(xmlGenericErrorContext,
25934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON callback for '%s' [wildcard]\n",
25935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaFormatQName(&str,
25936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName, inode->nsName));
25937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
25939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	FREE_AND_NULL(str)
25940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
25941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
25942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPushElem(xmlSchemaValidCtxtPtr vctxt)
2594660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
25947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode = xmlSchemaGetFreshElemInfo(vctxt);
25948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode == NULL) {
25949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidatorPushElem",
25950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaGetFreshElemInfo()");
25951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
2595260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nbAttrInfos = 0;
25954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
25955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVCheckINodeDataType(xmlSchemaValidCtxtPtr vctxt,
25959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaNodeInfoPtr inode,
25960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     xmlSchemaTypePtr type,
25961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     const xmlChar *value)
25962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->flags & XML_SCHEMA_NODE_INFO_VALUE_NEEDED)
25964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaVCheckCVCSimpleType(
25965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTXT_CAST vctxt, NULL,
25966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, &(inode->val), 1, 1, 0));
25967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
25968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (xmlSchemaVCheckCVCSimpleType(
25969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTXT_CAST vctxt, NULL,
25970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    type, value, NULL, 1, 0, 0));
25971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
25972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2597560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/*
25976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process END of element.
25977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
25978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
25979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidatorPopElem(xmlSchemaValidCtxtPtr vctxt)
25980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
25981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
25982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr inode = vctxt->inode;
25983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0)
25985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
25986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->flags & XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED) {
25987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* This element was not expected;
25989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we will not validate child elements of broken parents.
25990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Skip validation of all content of the parent.
25991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
25992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = vctxt->depth -1;
25993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
2599460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
25995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->typeDef == NULL) ||
25996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(inode->flags & XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE)) {
25997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
25998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 1. the type definition might be missing if the element was
25999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*    error prone
26000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* 2. it might be abstract.
26001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check the content model.
26006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) ||
26008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)) {
26009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Workaround for "anyType".
26012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inode->typeDef->builtInType == XML_SCHEMAS_ANYTYPE)
2601460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    goto character_content;
2601560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((inode->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) == 0) {
26017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *values[10];
26018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int terminal, nbval = 10, nbneg;
26019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (inode->regexCtxt == NULL) {
26021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the regex context.
26023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->regexCtxt =
26025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRegNewExecCtxt(inode->typeDef->contModel,
26026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
26027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt);
26028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (inode->regexCtxt == NULL) {
26029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidatorPopElem",
26030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to create a regex context");
26031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
26032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON create on '%s'\n", inode->localName);
2603660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott#endif
26037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Get hold of the still expected content, since a further
26040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * call to xmlRegExecPushString() will loose this information.
2604160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegExecNextValues(inode->regexCtxt,
26043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		&nbval, &nbneg, &values[0], &terminal);
26044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegExecPushString(inode->regexCtxt, NULL, NULL);
26045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ret<0) || ((ret==0) && (!INODE_NILLED(inode)))) {
26046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Still missing something.
26048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 1;
26050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->flags |=
26051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_ELEMENT_CONTENT, NULL, NULL,
26054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "Missing child element(s)",
26055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbval, nbneg, values);
26056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON missing ERROR on '%s'\n",
26059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName);
26060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Content model is satisfied.
26064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
26066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "AUTOMATON succeeded on '%s'\n",
26069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode->localName);
26070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->typeDef->contentType == XML_SCHEMA_CONTENT_ELEMENTS)
26076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectcharacter_content:
26079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->value != NULL) {
26081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeValue(vctxt->value);
26082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->value = NULL;
26083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Check character content.
26086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->decl == NULL) {
26088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Speedup if no declaration exists.
26090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2609160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	if (WXS_IS_SIMPLE(inode->typeDef)) {
26092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef, inode->value);
26094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef,
26097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->value);
2609860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
26100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidatorPopElem",
26101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaVCheckCVCSimpleType()");
26102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto end_elem;
26105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2610760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * cvc-elt (3.3.4) : 5
26108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * The appropriate case among the following must be true:
26109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2611160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * cvc-elt (3.3.4) : 5.1
2611260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * If the declaration has a {value constraint},
2611360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * the item has neither element nor character [children] and
26114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * clause 3.2 has not applied, then all of the following must be true:
26115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->decl->value != NULL) &&
2611760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	(inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY) &&
26118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(! INODE_NILLED(inode))) {
26119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2612060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* cvc-elt (3.3.4) : 5.1.1
2612160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* If the �actual type definition� is a �local type definition�
26122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* then the canonical lexical representation of the {value constraint}
2612360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* value must be a valid default for the �actual type definition� as
2612460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* defined in Element Default Valid (Immediate) (�3.3.6).
26125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2612660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: 'local' above means types acquired by xsi:type.
26128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* NOTE: Although the *canonical* value is stated, it is not
26129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* relevant if canonical or not. Additionally XML Schema 1.1
26130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* will removed this requirement as well.
26131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (inode->flags & XML_SCHEMA_ELEM_INFO_LOCAL_TYPE) {
26133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaCheckCOSValidDefault(vctxt,
26135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->decl->value, &(inode->val));
26136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
26137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
26138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidatorPopElem",
26139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaCheckCOSValidDefault()");
26140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
26141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto end_elem;
26143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Stop here, to avoid redundant validation of the value
26146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (see following).
26147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto default_psvi;
2614960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
2615060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
2615160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* cvc-elt (3.3.4) : 5.1.2
2615260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* The element information item with the canonical lexical
2615360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* representation of the {value constraint} value used as its
2615460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �normalized value� must be �valid� with respect to the
2615560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* �actual type definition� as defined by Element Locally Valid (Type)
2615660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* (�3.3.4).
2615760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(inode->typeDef)) {
26159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef, inode->decl->value);
26161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef,
2616460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		inode->decl->value);
26165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
26170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto end_elem;
26173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdefault_psvi:
26176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* PSVI: Create a text node on the instance element.
26178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->options & XML_SCHEMA_VAL_VC_I_CREATE) &&
26180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (inode->node != NULL)) {
26181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlNodePtr textChild;
26182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *normValue;
26183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: Normalize the value.
2618560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    normValue = xmlSchemaNormalizeValue(inode->typeDef,
26187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode->decl->value);
26188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (normValue != NULL) {
26189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		textChild = xmlNewText(BAD_CAST normValue);
26190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(normValue);
26191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
26192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		textChild = xmlNewText(inode->decl->value);
26193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (textChild == NULL) {
26194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlNewText()");
26196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
2619860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		xmlAddChild(inode->node, textChild);
26199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2620060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
2620160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    } else if (! INODE_NILLED(inode)) {
26202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2620360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 5.2.1 The element information item must be �valid� with respect
2620460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* to the �actual type definition� as defined by Element Locally
2620560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* Valid (Type) (�3.3.4).
2620660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (WXS_IS_SIMPLE(inode->typeDef)) {
26208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     /*
26209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-type) (3.1)
26210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * "If the type definition is a simple type definition, ..."
26211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * (3.1.3) "If clause 3.2 of Element Locally Valid
2621260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (Element) (�3.3.4) did not apply, then the �normalized value�
2621360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * must be �valid� with respect to the type definition as defined
2621460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * by String Valid (�3.14.4).
2621560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
26216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    inode, inode->typeDef, inode->value);
26218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-type) (3.2) "If the type definition is a complex type
26221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * definition, then the element information item must be
2622260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �valid� with respect to the type definition as per
2622360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * Element Locally Valid (Complex Type) (�3.4.4);"
26224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    *
26225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-complex-type) (2.2)
2622660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "If the {content type} is a simple type definition, ...
2622760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * the �normalized value� of the element information item is
2622860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * �valid� with respect to that simple type definition as
2622960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * defined by String Valid (�3.14.4)."
26230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVCheckINodeDataType(vctxt,
26232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		inode, inode->typeDef->contentTypeDef, inode->value);
2623360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidatorPopElem",
26237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVCheckCVCSimpleType()");
26238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto end_elem;
26241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
2624360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* 5.2.2 If there is a fixed {value constraint} and clause 3.2 has
26244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* not applied, all of the following must be true:
26245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((inode->decl->value != NULL) &&
26247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (inode->decl->flags & XML_SCHEMAS_ELEM_FIXED)) {
26248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: We will need a computed value, when comparison is
26251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * done on computed values.
26252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
2625460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * 5.2.2.1 The element information item must have no element
26255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * information item [children].
26256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (inode->flags &
26258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_ELEM_INFO_HAS_ELEM_CONTENT) {
26259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_ELT_5_2_2_1;
26260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL,
26261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "The content must not containt element nodes since "
26262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "there is a fixed value constraint");
26263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto end_elem;
26264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2626660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		* 5.2.2.2 The appropriate case among the following must
26267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* be true:
2626860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		*/
26269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (WXS_HAS_MIXED_CONTENT(inode->typeDef)) {
26270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2627160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 5.2.2.2.1 If the {content type} of the �actual type
2627260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * definition� is mixed, then the *initial value* of the
2627360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * item must match the canonical lexical representation
26274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * of the {value constraint} value.
26275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *
2627660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * ... the *initial value* of an element information
2627760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * item is the string composed of, in order, the
2627860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * [character code] of each character information item in
26279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * the [children] of that element information item.
2628060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    */
26281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! xmlStrEqual(inode->value, inode->decl->value)){
2628260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
26283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: Report invalid & expected values as well.
26284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: Implement the canonical stuff.
26285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
26286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_1;
2628760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			xmlSchemaCustomErr(ACTXT_CAST vctxt,
26288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, NULL, NULL,
26289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The initial value '%s' does not match the fixed "
26290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "value constraint '%s'",
26291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->value, inode->decl->value);
26292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto end_elem;
26293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
26294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else if (WXS_HAS_SIMPLE_CONTENT(inode->typeDef)) {
26295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
2629660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * 5.2.2.2.2 If the {content type} of the �actual type
2629760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * definition� is a simple type definition, then the
2629860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    * *actual value* of the item must match the canonical
26299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * lexical representation of the {value constraint} value.
26300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
26301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
26302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: *actual value* is the normalized value, impl.
26303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *           this.
26304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: Report invalid & expected values as well.
26305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: Implement a comparison with the computed values.
26306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
26307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (! xmlStrEqual(inode->value,
26308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->decl->value)) {
26309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = XML_SCHEMAV_CVC_ELT_5_2_2_2_2;
26310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaCustomErr(ACTXT_CAST vctxt,
26311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    ret, NULL, NULL,
26312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "The actual value '%s' does not match the fixed "
2631360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			    "value constraint '%s'",
26314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->value,
26315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    inode->decl->value);
26316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto end_elem;
2631760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    }
26318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2631960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    }
26320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2632260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectend_elem:
26324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0) {
26325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* TODO: raise error? */
26326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth == vctxt->skipDepth)
26329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = -1;
26330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate the history of XPath state objects.
2633260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
26333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->appliedXPath &&
26334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(xmlSchemaXPathProcessHistory(vctxt, vctxt->depth) == -1))
26335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
26336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * MAYBE TODO:
2633860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * SPEC (6) "The element information item must be �valid� with
26339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * respect to each of the {identity-constraint definitions} as per
2634060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Identity-constraint Satisfied (�3.11.4)."
26341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * PSVI TODO: If we expose IDC node-tables via PSVI then the tables
26344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   need to be built in any case.
26345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   We will currently build IDC node-tables and bubble them only if
26346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   keyrefs do exist.
26347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
2634860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Add the current IDC target-nodes to the IDC node-tables.
26351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((inode->idcMatchers != NULL) &&
26353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    {
26355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaIDCFillNodeTables(vctxt, inode) == -1)
26356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate IDC keyrefs.
26360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->hasKeyrefs)
26362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (xmlSchemaCheckCVCIDCKeyRef(vctxt) == -1)
26363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Merge/free the IDC table.
26366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inode->idcTable != NULL) {
26368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_IDC_NODE_TABLE
26369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaDebugDumpIDCTable(stdout,
26370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->nsName,
26371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->localName,
26372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    inode->idcTable);
26373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->depth > 0) &&
26375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->hasKeyrefs || vctxt->createIDCNodeTables))
26376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	{
26377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Merge the IDC node table with the table of the parent node.
26379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaBubbleIDCNodeTables(vctxt) == -1)
26381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
2638260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	}
26383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Clear the current ielem.
26386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * VAL TODO: Don't free the PSVI IDC tables if they are
26387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * requested for the PSVI.
26388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaClearElemInfo(vctxt, inode);
26390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip further processing if we are on the validation root.
26392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth == 0) {
26394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->depth--;
26395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode = NULL;
26396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Reset the keyrefDepth if needed.
26400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs != NULL) {
26402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr aidc = vctxt->aidcs;
26403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
26404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (aidc->keyrefDepth == vctxt->depth) {
26405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* A 'keyrefDepth' of a key/unique IDC matches the current
26407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* depth, this means that we are leaving the scope of the
26408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* top-most keyref IDC which refers to this IDC.
26409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		aidc->keyrefDepth = -1;
26411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    aidc = aidc->next;
26413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (aidc != NULL);
26414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2641560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    vctxt->depth--;
26416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode = vctxt->elemInfos[vctxt->depth];
26417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2641860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * VAL TODO: 7 If the element information item is the �validation root�, it must be
2641960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * �valid� per Validation Root Valid (ID/IDREF) (�3.3.4).
26420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
26424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
26425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
26426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
26429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* 3.4.4 Complex Type Definition Validation Rules
26430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Validation Rule: Element Locally Valid (Complex Type) (cvc-complex-type)
26431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
26432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateChildElem(xmlSchemaValidCtxtPtr vctxt)
26434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr pielem;
26436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr ptype;
26437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
26438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth <= 0) {
26440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateChildElem",
26441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "not intended for the validation root");
26442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
26443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pielem = vctxt->elemInfos[vctxt->depth -1];
26445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
26446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
26447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Handle 'nilled' elements.
26449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (INODE_NILLED(pielem)) {
26451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC (cvc-elt) (3.3.4) : (3.2.1)
26453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_PARENT_ELEM;
26455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_ELT_3_2_1;
26456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(ret, NULL,
26457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Neither character nor element content is allowed, "
26458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the element was 'nilled'");
26459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ACTIVATE_ELEM;
26460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto unexpected_elem;
26461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ptype = pielem->typeDef;
26464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ptype->builtInType == XML_SCHEMAS_ANYTYPE) {
26466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Workaround for "anyType": we have currently no content model
26468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* assigned for "anyType", so handle it explicitely.
26469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "anyType" has an unbounded, lax "any" wildcard.
26470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->localName,
26473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName);
26474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl == NULL) {
26476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaAttrInfoPtr iattr;
26477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process "xsi:type".
26479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (cvc-assess-elt) (1.2.1.2.1) - (1.2.1.2.3)
26480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    iattr = xmlSchemaGetMetaAttrInfo(vctxt,
26482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		XML_SCHEMA_ATTR_INFO_META_XSI_TYPE);
26483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (iattr != NULL) {
26484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlSchemaProcessXSIType(vctxt, iattr,
26485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &(vctxt->inode->typeDef), NULL);
26486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret != 0) {
26487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
26488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaValidateChildElem",
26489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaProcessXSIType() to "
26490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "process the attribute 'xsi:nil'");
26491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			return (-1);
26492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
26493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (ret);
26494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 /*
26497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Fallback to "anyType".
26498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 *
26499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * SPEC (cvc-assess-elt)
2650060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * "If the item cannot be �strictly assessed�, [...]
26501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * an element information item's schema validity may be laxly
2650260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * assessed if its �context-determined declaration� is not
2650360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * skip by �validating� with respect to the �ur-type
2650460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		 * definition� as per Element Locally Valid (Type) (�3.3.4)."
26505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->typeDef =
26507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaGetBuiltInType(XML_SCHEMAS_ANYTYPE);
26508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (ptype->contentType) {
26514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_EMPTY:
26515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.1) "If the {content type} is empty, then the
26517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element information item has no character or element
26518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * information item [children]."
26519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_PARENT_ELEM
26521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1;
26522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
26523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Element content is not allowed, "
26524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"because the content type is empty");
26525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM
26526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto unexpected_elem;
26527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_MIXED:
26530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SCHEMA_CONTENT_ELEMENTS: {
26531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRegExecCtxtPtr regexCtxt;
26532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *values[10];
26533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int terminal, nbval = 10, nbneg;
26534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /* VAL TODO: Optimized "anyType" validation.*/
26536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ptype->contModel == NULL) {
26538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "type has elem content but no content model");
26540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Safety belf for evaluation if the cont. model was already
26544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * examined to be invalid.
26545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (pielem->flags & XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT) {
26547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "validating elem, but elem content is already invalid");
26549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    regexCtxt = pielem->regexCtxt;
26553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (regexCtxt == NULL) {
26554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Create the regex context.
26556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		regexCtxt = xmlRegNewExecCtxt(ptype->contModel,
26558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (xmlRegExecCallbacks) xmlSchemaVContentModelCallback,
26559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt);
26560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (regexCtxt == NULL) {
26561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaValidateChildElem",
26562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"failed to create a regex context");
26563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return (-1);
26564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
26565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		pielem->regexCtxt = regexCtxt;
26566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext, "AUTOMATA create on '%s'\n",
26568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    pielem->localName);
26569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * SPEC (2.4) "If the {content type} is element-only or mixed,
26574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * then the sequence of the element information item's
26575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element information item [children], if any, taken in
2657660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * order, is �valid� with respect to the {content type}'s
26577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * particle, as defined in Element Sequence Locally Valid
2657860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * (Particle) (�3.9.4)."
26579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlRegExecPushString2(regexCtxt,
26581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName,
26582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->nsName,
26583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode);
26584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_AUTOMATA
26585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0)
26586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON push ERROR for '%s' on '%s'\n",
26588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, pielem->localName);
26589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
26590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlGenericError(xmlGenericErrorContext,
26591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"AUTOMATON push OK for '%s' on '%s'\n",
26592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->localName, pielem->localName);
26593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
26594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->err == XML_SCHEMAV_INTERNAL) {
26595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateChildElem",
26596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlRegExecPushString2()");
26597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
26598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRegExecErrInfo(regexCtxt, NULL, &nbval, &nbneg,
26601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    &values[0], &terminal);
26602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlSchemaComplexTypeErr(ACTXT_CAST vctxt,
26603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMAV_ELEMENT_CONTENT, NULL,NULL,
26604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "This element is not expected",
26605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    nbval, nbneg, values);
26606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = vctxt->err;
26607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto unexpected_elem;
26608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
26609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = 0;
26610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_SIMPLE:
26613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SCHEMA_CONTENT_BASIC:
26614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_PARENT_ELEM
26615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (WXS_IS_COMPLEX(ptype)) {
26616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-complex-type) (2.2)
26618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* "If the {content type} is a simple type definition, then
26619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* the element information item has no element information
26620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* item [children], ..."
26621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_COMPLEX_TYPE_2_2;
26623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL, "Element content is not allowed, "
26624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "because the content type is a simple type definition");
26625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
26626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* SPEC (cvc-type) (3.1.2) "The element information item must
26628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* have no element information item [children]."
26629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = XML_SCHEMAV_CVC_TYPE_3_1_2;
26631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR(ret, NULL, "Element content is not allowed, "
26632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "because the type definition is simple");
26633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ACTIVATE_ELEM
26635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = vctxt->err;
26636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto unexpected_elem;
26637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
26640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
26641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectunexpected_elem:
26644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Pop this element and set the skipDepth to skip
26646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * all further content of the parent element.
26647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->skipDepth = vctxt->depth;
26649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_NOT_EXPECTED;
26650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pielem->flags |= XML_SCHEMA_ELEM_INFO_ERR_BAD_CONTENT;
26651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_PERSIST 1
26655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_CREATED 2
26656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMA_PUSH_TEXT_VOLATILE 3
26657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVPushText(xmlSchemaValidCtxtPtr vctxt,
26660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int nodeType, const xmlChar *value, int len,
26661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  int mode, int *consumed)
26662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Unfortunately we have to duplicate the text sometimes.
26665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * OPTIMIZE: Maybe we could skip it, if:
26666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   1. content type is simple
26667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   2. whitespace is "collapse"
26668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   3. it consists of whitespace only
26669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *
26670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Process character content.
26671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (consumed != NULL)
26673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*consumed = 0;
26674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (INODE_NILLED(vctxt->inode)) {
2667560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* SPEC cvc-elt (3.3.4 - 3.2.1)
26677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* "The element information item must have no character or
26678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* element information item [children]."
26679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_ELT_3_2_1, NULL,
26681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Neither character nor element content is allowed "
26682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the element is 'nilled'");
26683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
26684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SPEC (2.1) "If the {content type} is empty, then the
26687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * element information item has no character or element
26688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * information item [children]."
26689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->contentType ==
2669160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    XML_SCHEMA_CONTENT_EMPTY) {
26692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_1, NULL,
26693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Character content is not allowed, "
26694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "because the content type is empty");
26695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (vctxt->err);
26696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->contentType ==
26699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMA_CONTENT_ELEMENTS) {
26700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((nodeType != XML_TEXT_NODE) ||
26701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (! xmlSchemaIsBlank((xmlChar *) value, len))) {
2670260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    /*
2670360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * SPEC cvc-complex-type (2.3)
2670460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * "If the {content type} is element-only, then the
2670560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * element information item has no character information
2670660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * item [children] other than those whose [character
2670760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    * code] is defined as a white space in [XML 1.0 (Second
26708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Edition)]."
26709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(XML_SCHEMAV_CVC_COMPLEX_TYPE_2_3, NULL,
26711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"Character content other than whitespace is not allowed "
26712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"because the content type is 'element-only'");
26713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (vctxt->err);
26714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2671760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((value == NULL) || (value[0] == 0))
26719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
26720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Save the value.
26722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE that even if the content type is *mixed*, we need the
26723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * *initial value* for default/fixed value constraints.
26724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->inode->typeDef->contentType == XML_SCHEMA_CONTENT_MIXED) &&
26726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	((vctxt->inode->decl == NULL) ||
26727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->inode->decl->value == NULL)))
26728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
2672960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
26730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->value == NULL) {
26731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Set the value.
26733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (mode) {
26735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_PERSIST:
26736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working on a tree.
26738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->value = value;
26740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_CREATED:
26742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working with the reader.
26744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The value will be freed by the element info.
26745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->value = value;
26747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (consumed != NULL)
26748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    *consumed = 1;
26749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |=
26750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    case XML_SCHEMA_PUSH_TEXT_VOLATILE:
26753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
26754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* When working with SAX.
26755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* The value will be freed by the element info.
26756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
26757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (len != -1)
26758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->value = BAD_CAST xmlStrndup(value, len);
26759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		else
26760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    vctxt->inode->value = BAD_CAST xmlStrdup(value);
26761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		vctxt->inode->flags |=
26762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    default:
26765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
26766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
26768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (len < 0)
26769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    len = xmlStrlen(value);
26770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Concat the value.
2677260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	*/
26773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->flags & XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES) {
26774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->value = BAD_CAST xmlStrncat(
26775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(xmlChar *) vctxt->inode->value, value, len);
26776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
26777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->value =
26778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		BAD_CAST xmlStrncatNew(vctxt->inode->value, value, len);
26779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_VALUES;
26780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2678160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
26782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
26784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateElem(xmlSchemaValidCtxtPtr vctxt)
26788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
26790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) &&
26792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(vctxt->depth >= vctxt->skipDepth)) {
26793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElem",
26794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "in skip-state");
26795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
26796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xsiAssemble) {
2679860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
26799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* We will stop validation if there was an error during
26800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* dynamic schema construction.
26801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Note that we simply set @skipDepth to 0, this could
26802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* mean that a streaming document via SAX would be
26803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* still read to the end but it won't be validated any more.
26804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* TODO: If we are sure how to stop the validation at once
26805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   for all input scenarios, then this should be changed to
26806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*   instantly stop the validation.
26807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaAssembleByXSI(vctxt);
26809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1)
26811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = 0;
26813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(ret);
26814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26815df143a5041f03a22808b59c76698770b74692815Selim Gurun        /*
26816df143a5041f03a22808b59c76698770b74692815Selim Gurun         * Augment the IDC definitions for the main schema and all imported ones
26817df143a5041f03a22808b59c76698770b74692815Selim Gurun         * NOTE: main schema is the first in the imported list
26818df143a5041f03a22808b59c76698770b74692815Selim Gurun         */
26819df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
26820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth > 0) {
26822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Validate this element against the content model
26824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* of the parent.
26825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaValidateChildElem(vctxt);
26827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElem",
26830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaStreamValidateChildElement()");
26831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->depth == vctxt->skipDepth)
26836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->inode->decl == NULL) &&
26838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->typeDef == NULL)) {
26839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"the child element was valid but neither the "
26841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"declaration nor the type was set");
26842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
26845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Get the declaration of the validation root.
26847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->decl = xmlSchemaGetElem(vctxt->schema,
26849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->localName,
26850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->nsName);
26851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl == NULL) {
26852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = XML_SCHEMAV_CVC_ELT_1;
26853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR(ret, NULL,
26854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"No matching global declaration available "
26855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"for the validation root");
26856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->decl == NULL)
26861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto type_validation;
26862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->decl->type == XML_SCHEMA_TYPE_ANY) {
26864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int skip;
26865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Wildcards.
26867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaValidateElemWildcard(vctxt, &skip);
26869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret != 0) {
26870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
26871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaValidateElem",
26872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidateElemWildcard()");
26873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
26874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
26875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (skip) {
26878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = vctxt->depth;
26879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto exit;
26880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
26882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* The declaration might be set by the wildcard validation,
26883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* when the processContents is "lax" or "strict".
26884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
26885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->inode->decl->type != XML_SCHEMA_TYPE_ELEMENT) {
26886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
26887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Clear the "decl" field to not confuse further processing.
26888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
26889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->inode->decl = NULL;
26890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto type_validation;
26891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the declaration.
26895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateElemDecl(vctxt);
26897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
26898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret < 0) {
26899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidateElemDecl()");
26901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
26904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate against the type definition.
26907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttype_validation:
26909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef == NULL) {
26911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_TYPE_1;
26913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	VERROR(ret, NULL,
26914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	    "The type definition is absent");
26915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2691660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
26917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->typeDef->flags & XML_SCHEMAS_TYPE_ABSTRACT) {
26918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags |= XML_SCHEMA_NODE_INFO_ERR_BAD_TYPE;
26919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = XML_SCHEMAV_CVC_TYPE_2;
26920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	    VERROR(ret, NULL,
2692160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    	    "The type definition is abstract");
26922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
26923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Evaluate IDCs. Do it here, since new IDC matchers are registered
26926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * during validation against the declaration. This must be done
26927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * _before_ attribute validation.
26928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL) {
26930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaXPathEvaluate(vctxt, XML_ELEMENT_NODE);
26931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->appliedXPath = 1;
26932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
26933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaValidateElem",
26934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaXPathEvaluate()");
26935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
26936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate attributes.
26940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (WXS_IS_COMPLEX(vctxt->inode->typeDef)) {
26942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->nbAttrInfos != 0) ||
26943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (vctxt->inode->typeDef->attrUses != NULL)) {
26944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVAttributesComplex(vctxt);
26946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
26947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->nbAttrInfos != 0) {
26948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVAttributesSimple(vctxt);
26950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Clear registered attributes.
26953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0)
26955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
26956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1) {
26957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaValidateElem",
26958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling attributes validation");
26959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
26960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Don't return an error if attributes are invalid on purpose.
26963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = 0;
26965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
26967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
26968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->skipDepth = vctxt->depth;
26969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
26970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
26971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
26972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
26973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_SCHEMA_READER_ENABLED
26975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
26976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVReaderWalk(xmlSchemaValidCtxtPtr vctxt)
26977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
26978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const int WHTSP = 13, SIGN_WHTSP = 14, END_ELEM = 15;
26979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth, nodeType, ret = 0, consumed;
26980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
26981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
26983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlTextReaderRead(vctxt->reader);
26984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
26985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Move to the document element.
26986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
26987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (ret == 1) {
26988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nodeType = xmlTextReaderNodeType(vctxt->reader);
26989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE)
26990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto root_found;
26991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlTextReaderRead(vctxt->reader);
26992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
26993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    goto exit;
26994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectroot_found:
26996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
26997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
26998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	depth = xmlTextReaderDepth(vctxt->reader);
26999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	nodeType = xmlTextReaderNodeType(vctxt->reader);
27000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (nodeType == XML_ELEMENT_NODE) {
2700260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
27003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth++;
27004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidatorPushElem()");
27007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem = vctxt->inode;
27010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->localName = xmlTextReaderLocalName(vctxt->reader);
27011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nsName = xmlTextReaderNamespaceUri(vctxt->reader);
27012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->flags |= XML_SCHEMA_NODE_INFO_FLAG_OWNED_NAMES;
27013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Is the element empty?
27015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlTextReaderIsEmptyElement(vctxt->reader);
27017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlTextReaderIsEmptyElement()");
27020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret) {
27023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Register attributes.
27027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nbAttrInfos = 0;
27029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlTextReaderMoveToFirstAttribute(vctxt->reader);
27030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlTextReaderMoveToFirstAttribute()");
27033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == 1) {
27036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
27037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
27038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * VAL TODO: How do we know that the reader works on a
27039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    * node tree, to be able to pass a node here?
27040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    */
27041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (xmlSchemaValidatorPushAttribute(vctxt, NULL,
27042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(const xmlChar *) xmlTextReaderLocalName(vctxt->reader),
27043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlTextReaderNamespaceUri(vctxt->reader), 1,
27044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlTextReaderValue(vctxt->reader), 1) == -1) {
27045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVReaderWalk",
27047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaValidatorPushAttribute()");
27048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlTextReaderMoveToNextAttribute(vctxt->reader);
27051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
27052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaVReaderWalk",
27053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlTextReaderMoveToFirstAttribute()");
27054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (ret == 1);
27057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Back to element position.
27059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = xmlTextReaderMoveToElement(vctxt->reader);
27061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlTextReaderMoveToElement()");
27064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the element.
27069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret= xmlSchemaValidateElem(vctxt);
27071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidateElem()");
27075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
27078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->depth == vctxt->skipDepth) {
27080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int curDepth;
27081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Skip all content.
27083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY) == 0) {
27085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlTextReaderRead(vctxt->reader);
27086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    curDepth = xmlTextReaderDepth(vctxt->reader);
27087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    while ((ret == 1) && (curDepth != depth)) {
27088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = xmlTextReaderRead(vctxt->reader);
27089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			curDepth = xmlTextReaderDepth(vctxt->reader);
27090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret < 0) {
27092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/*
27093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* VAL TODO: A reader error occured; what to do here?
27094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
27095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ret = 1;
27096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto exit;
27097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_elem;
27100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * READER VAL TODO: Is an END_ELEM really never called
27103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * if the elem is empty?
27104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_elem;
27107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if (nodeType == END_ELEM) {
27108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process END of element.
27110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectleave_elem:
27112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPopElem(vctxt);
27113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
27115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVReaderWalk",
27116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidatorPopElem()");
27117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
27120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (vctxt->depth >= 0)
27122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem = vctxt->inode;
27123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
27124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem = NULL;
27125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((nodeType == XML_TEXT_NODE) ||
27126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == XML_CDATA_SECTION_NODE) ||
27127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == WHTSP) ||
27128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == SIGN_WHTSP)) {
27129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process character content.
27131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlChar *value;
27133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((nodeType == WHTSP) || (nodeType == SIGN_WHTSP))
27135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		nodeType = XML_TEXT_NODE;
27136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = xmlTextReaderValue(vctxt->reader);
27138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVPushText(vctxt, nodeType, BAD_CAST value,
27139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, XML_SCHEMA_PUSH_TEXT_CREATED, &consumed);
27140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (! consumed)
27141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlFree(value);
27142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVReaderWalk",
27144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVPushText()");
27145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((nodeType == XML_ENTITY_NODE) ||
27148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (nodeType == XML_ENTITY_REF_NODE)) {
27149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * VAL TODO: What to do with entities?
27151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    TODO
27153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Read next node.
27156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlTextReaderRead(vctxt->reader);
27158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (ret == 1);
27159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
27164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
27166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
27168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
27169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			SAX validation handlers				*
27170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
27171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
27172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
27174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process text content.
27175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
27176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2717760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaSAXHandleText(void *ctx,
2717860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		       const xmlChar * ch,
27179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       int len)
27180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaVPushText(vctxt, XML_TEXT_NODE, ch, len,
27190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
27191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleCDataSection",
27192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVPushText()");
27193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->err = -1;
27194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStopParser(vctxt->parserCtxt);
27195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
27199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project* Process CDATA content.
27200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project*/
27201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2720260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaSAXHandleCDataSection(void *ctx,
2720360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			     const xmlChar * ch,
27204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			     int len)
2720560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
27206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->inode->flags & XML_SCHEMA_ELEM_INFO_EMPTY)
27213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->inode->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaVPushText(vctxt, XML_CDATA_SECTION_NODE, ch, len,
27215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_SCHEMA_PUSH_TEXT_VOLATILE, NULL) == -1) {
27216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleCDataSection",
27217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaVPushText()");
27218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->err = -1;
27219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlStopParser(vctxt->parserCtxt);
27220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleReference(void *ctx ATTRIBUTE_UNUSED,
27225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    const xmlChar * name ATTRIBUTE_UNUSED)
27226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->depth < 0)
27230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* SAX VAL TODO: What to do here? */
27234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO
27235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleStartElementNs(void *ctx,
2723960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * localname,
2724060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * prefix ATTRIBUTE_UNUSED,
2724160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar * URI,
2724260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_namespaces,
2724360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 const xmlChar ** namespaces,
2724460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_attributes,
2724560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott				 int nb_defaulted ATTRIBUTE_UNUSED,
27246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				 const xmlChar ** attributes)
2724760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
27248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
27250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem;
27251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j;
2725260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
27253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: What to do with nb_defaulted?
27255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip elements if inside a "skip" wildcard or invalid.
27258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth++;
27260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
27262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Push the element.
27264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaValidatorPushElem(vctxt) == -1) {
27266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "calling xmlSchemaValidatorPushElem()");
27268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto internal_error;
27269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem = vctxt->inode;
27271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is this OK?
27273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->nodeLine = xmlSAX2GetLineNumber(vctxt->parserCtxt);
27275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->localName = localname;
27276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->nsName = URI;
27277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Register namespaces on the elem info.
2728060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
27281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nb_namespaces != 0) {
27282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Although the parser builds its own namespace list,
27284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* we have no access to it, so we'll use an own one.
27285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
2728660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        for (i = 0, j = 0; i < nb_namespaces; i++, j += 2) {
27287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Store prefix and namespace name.
2728960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ielem->nsBindings == NULL) {
27291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings =
27292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar **) xmlMalloc(10 *
27293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			sizeof(const xmlChar *));
27294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ielem->nsBindings == NULL) {
27295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaVErrMemory(vctxt,
27296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"allocating namespace bindings for SAX validation",
27297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
27298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nbNsBindings = 0;
27301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->sizeNsBindings = 5;
27302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else if (ielem->sizeNsBindings <= ielem->nbNsBindings) {
27303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->sizeNsBindings *= 2;
27304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings =
27305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (const xmlChar **) xmlRealloc(
27306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(void *) ielem->nsBindings,
27307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ielem->sizeNsBindings * 2 * sizeof(const xmlChar *));
27308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ielem->nsBindings == NULL) {
27309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlSchemaVErrMemory(vctxt,
27310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"re-allocating namespace bindings for SAX validation",
27311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			NULL);
27312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nsBindings[ielem->nbNsBindings * 2] = namespaces[j];
27317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (namespaces[j+1][0] == 0) {
27318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Handle xmlns="".
27320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] = NULL;
27322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else
27323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsBindings[ielem->nbNsBindings * 2 + 1] =
27324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    namespaces[j+1];
2732560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    ielem->nbNsBindings++;
27326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Register attributes.
27330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: We are not adding namespace declaration
27331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * attributes yet.
27332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nb_attributes != 0) {
27334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlChar *value;
27335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0, i = 0; i < nb_attributes; i++, j += 5) {
27337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Duplicate the value.
2733960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    value = xmlStrndup(attributes[j+3],
27341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attributes[j+4] - attributes[j+3]);
27342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * TODO: Set the node line.
27344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPushAttribute(vctxt,
27346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		NULL, ielem->nodeLine, attributes[j], attributes[j+2], 0,
27347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		value, 1);
27348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret == -1) {
27349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaValidatorPushAttribute()");
27351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Validate the element.
27357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateElem(vctxt);
27359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
27360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == -1) {
27361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaSAXHandleStartElementNs",
27362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidateElem()");
27363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
2736660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
27367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
27372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStopParser(vctxt->parserCtxt);
27373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXHandleEndElementNs(void *ctx,
27378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * localname ATTRIBUTE_UNUSED,
27379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * prefix ATTRIBUTE_UNUSED,
27380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       const xmlChar * URI ATTRIBUTE_UNUSED)
27381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr vctxt = (xmlSchemaValidCtxtPtr) ctx;
27383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int res;
27384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Skip elements if inside a "skip" wildcard or if invalid.
27387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->skipDepth != -1) {
27389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->depth > vctxt->skipDepth) {
27390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth--;
27391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
27392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else
27393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->skipDepth = -1;
27394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * SAX VAL TODO: Just a temporary check.
27397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((!xmlStrEqual(vctxt->inode->localName, localname)) ||
27399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(!xmlStrEqual(vctxt->inode->nsName, URI))) {
27400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaSAXHandleEndElementNs",
27401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "elem pop mismatch");
27402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = xmlSchemaValidatorPopElem(vctxt);
27404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != 0) {
27405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (res < 0) {
27406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaSAXHandleEndElementNs",
27407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"calling xmlSchemaValidatorPopElem()");
27408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto exit;
27411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = -1;
27416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStopParser(vctxt->parserCtxt);
27417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
27418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
27421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
27422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Validation interfaces				*
27423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
27424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
27425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaNewValidCtxt:
27428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a precompiled XML Schemas
27429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schemas validation context based on the given schema.
27431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error
27433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidCtxtPtr
27435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaNewValidCtxt(xmlSchemaPtr schema)
27436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ret;
27438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaValidCtxtPtr) xmlMalloc(sizeof(xmlSchemaValidCtxt));
27440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
27441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaVErrMemory(NULL, "allocating validation context", NULL);
27442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
27443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaValidCtxt));
27445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_SCHEMA_CTXT_VALIDATOR;
27446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->dict = xmlDictCreate();
27447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nodeQNames = xmlSchemaItemListCreate();
27448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schema = schema;
27449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaClearValidCtxt:
27454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
27455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context;
27457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * leaves some fields alive intended for reuse of the context.
27458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
27460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt)
27461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt == NULL)
27463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Should we clear the flags?
27467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   Might be problematic if one reuses the context
27468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *   and assumes that the options remain the same.
27469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->flags = 0;
27471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->validationRoot = NULL;
27472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->doc = NULL;
27473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
27474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->reader = NULL;
27475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2747660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    vctxt->hasKeyrefs = 0;
27477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->value != NULL) {
27479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(vctxt->value);
27480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->value = NULL;
27481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Augmented IDC information.
27484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->aidcs != NULL) {
27486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr cur = vctxt->aidcs, next;
27487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
27488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = cur->next;
27489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(cur);
27490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = next;
27491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
27492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->aidcs = NULL;
27493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcMatcherCache != NULL) {
27495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCMatcherPtr matcher = vctxt->idcMatcherCache, tmp;
27496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while (matcher) {
27498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    tmp = matcher;
27499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    matcher = matcher->nextCached;
27500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCFreeMatcherList(tmp);
27501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcMatcherCache = NULL;
27503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->idcNodes != NULL) {
27507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCNodePtr item;
27509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->nbIdcNodes; i++) {
27511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = vctxt->idcNodes[i];
27512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item->keys);
27513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item);
27514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(vctxt->idcNodes);
27516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->idcNodes = NULL;
27517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->nbIdcNodes = 0;
27518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->sizeIdcNodes = 0;
27519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Note that we won't delete the XPath state pool here.
27522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xpathStates != NULL) {
27524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(vctxt->xpathStates);
27525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xpathStates = NULL;
27526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Attribute info.
27529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->nbAttrInfos != 0) {
27531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaClearAttrInfos(vctxt);
27532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Element info.
27535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->elemInfos != NULL) {
27537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ei;
27539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < vctxt->sizeElemInfos; i++) {
27541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ei = vctxt->elemInfos[i];
27542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ei == NULL)
27543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
27544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearElemInfo(vctxt, ei);
27545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
2754660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
27547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaItemListClear(vctxt->nodeQNames);
27548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* Recreate the dict. */
27549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDictFree(vctxt->dict);
27550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is is save to recreate it? Do we have a scenario
27552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * where the user provides the dict?
27553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->dict = xmlDictCreate();
27555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaFreeValidCtxt:
27559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
27560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context
27562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaFreeValidCtxt(xmlSchemaValidCtxtPtr ctxt)
27565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->value != NULL)
27569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(ctxt->value);
27570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeParserCtxt(ctxt->pctxt);
27572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idcNodes != NULL) {
27573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaPSVIIDCNodePtr item;
27575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->nbIdcNodes; i++) {
27577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    item = ctxt->idcNodes[i];
27578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item->keys);
27579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(item);
27580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->idcNodes);
27582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idcKeys != NULL) {
27584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->nbIdcKeys; i++)
27586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaIDCFreeKey(ctxt->idcKeys[i]);
27587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->idcKeys);
27588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->xpathStates != NULL) {
27591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(ctxt->xpathStates);
27592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->xpathStates = NULL;
27593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->xpathStatePool != NULL) {
27595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaFreeIDCStateObjList(ctxt->xpathStatePool);
27596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->xpathStatePool = NULL;
27597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Augmented IDC information.
27601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->aidcs != NULL) {
27603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaIDCAugPtr cur = ctxt->aidcs, next;
27604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	do {
27605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    next = cur->next;
27606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(cur);
27607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    cur = next;
27608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} while (cur != NULL);
27609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->attrInfos != NULL) {
27611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaAttrInfoPtr attr;
27613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* Just a paranoid call to the cleanup. */
27615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt->nbAttrInfos != 0)
27616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearAttrInfos(ctxt);
27617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->sizeAttrInfos; i++) {
27618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    attr = ctxt->attrInfos[i];
27619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(attr);
27620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->attrInfos);
27622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemInfos != NULL) {
27624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	int i;
27625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaNodeInfoPtr ei;
27626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	for (i = 0; i < ctxt->sizeElemInfos; i++) {
27628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ei = ctxt->elemInfos[i];
27629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ei == NULL)
27630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
27631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaClearElemInfo(ctxt, ei);
27632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(ei);
27633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFree(ctxt->elemInfos);
27635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nodeQNames != NULL)
27637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaItemListFree(ctxt->nodeQNames);
27638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->dict != NULL)
27639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlDictFree(ctxt->dict);
27640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
27641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaIsValid:
27645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context
27646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if any error was detected during validation.
2764860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
27649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if valid so far, 0 if errors were detected, and -1 in case
27650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         of internal error.
27651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaIsValid(xmlSchemaValidCtxtPtr ctxt)
27654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
27657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ctxt->err == 0);
27658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidErrors:
27662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
27663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function
27664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function
27665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
27666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations
27668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSchemaValidityErrorFunc err,
27672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSchemaValidityWarningFunc warn, void *ctx)
27673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
27677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
27678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
27679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserErrors(ctxt->pctxt, err, warn, ctx);
27681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidStructuredErrors:
27685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
27686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
27687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
27688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
27690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
27692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
27693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				  xmlStructuredErrorFunc serror, void *ctx)
27694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
27697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->serror = serror;
27698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
27699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
27700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errCtxt = ctx;
27701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pctxt != NULL)
27702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSetParserStructuredErrors(ctxt->pctxt, serror, ctx);
27703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaGetValidErrors:
2770760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a XML-Schema validation context
27708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err: the error function result
27709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result
27710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result
27711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations
27713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise
27715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaGetValidErrors(xmlSchemaValidCtxtPtr ctxt,
27718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValidityErrorFunc * err,
27719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlSchemaValidityWarningFunc * warn, void **ctx)
27720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctxt == NULL)
27722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return (-1);
27723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (err != NULL)
27724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*err = ctxt->error;
27725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (warn != NULL)
27726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*warn = ctxt->warning;
27727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ctx != NULL)
27728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*ctx = ctxt->errCtxt;
27729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (0);
27730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSetValidOptions:
27735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:	a schema validation context
27736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a combination of xmlSchemaValidOption
27737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the options to be used during the validation.
27739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of an
27741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * API error.
27742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSetValidOptions(xmlSchemaValidCtxtPtr ctxt,
27745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 int options)
27746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
27749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
27752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * WARNING: Change the start value if adding to the
27754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * xmlSchemaValidOption.
27755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * TODO: Is there an other, more easy to maintain,
27756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * way?
27757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 1; i < (int) sizeof(int) * 8; i++) {
27759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (options & 1<<i)
27760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return (-1);
27761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->options = options;
27763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
27764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
27767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidCtxtGetOptions:
2776860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a schema validation context
27769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the validation context options.
27771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
27772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the option combination or -1 on error.
27773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
27774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
27775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt)
27776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
27779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
27780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
27781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (ctxt->options);
27782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
27785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVDocWalk(xmlSchemaValidCtxtPtr vctxt)
27786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
27787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
27788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
27789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaNodeInfoPtr ielem = NULL;
27790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node, valRoot;
27791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *nsName;
27792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* DOC VAL TODO: Move this to the start function. */
27794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    valRoot = xmlDocGetRootElement(vctxt->doc);
27795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (valRoot == NULL) {
27796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/* VAL TODO: Error code? */
27797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR(1, NULL, "The document has no document element");
27798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (1);
27799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
27801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->validationRoot = valRoot;
27802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = valRoot;
27803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (node != NULL) {
27804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->skipDepth != -1) && (vctxt->depth >= vctxt->skipDepth))
27805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto next_sibling;
27806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ELEMENT_NODE) {
27807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Init the node-info.
27810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->depth++;
27812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlSchemaValidatorPushElem(vctxt) == -1)
27813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem = vctxt->inode;
27815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->node = node;
27816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->nodeLine = node->line;
27817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->localName = node->name;
27818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->ns != NULL)
27819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->nsName = node->ns->href;
27820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ielem->flags |= XML_SCHEMA_ELEM_INFO_EMPTY;
27821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Register attributes.
27823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: We do not register namespace declaration
27824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * attributes yet.
27825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->nbAttrInfos = 0;
27827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->properties != NULL) {
27828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		attr = node->properties;
27829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		do {
27830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (attr->ns != NULL)
27831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = attr->ns->href;
27832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    else
27833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			nsName = NULL;
27834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ret = xmlSchemaValidatorPushAttribute(vctxt,
27835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			(xmlNodePtr) attr,
2783660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott			/*
27837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* Note that we give it the line number of the
27838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			* parent element.
27839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			*/
27840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ielem->nodeLine,
27841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			attr->name, nsName, 0,
27842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNodeListGetString(attr->doc, attr->children, 1), 1);
27843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ret == -1) {
27844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VERROR_INT("xmlSchemaDocWalk",
27845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    "calling xmlSchemaValidatorPushAttribute()");
27846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			goto internal_error;
27847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
27848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
27849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} while (attr);
27850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Validate the element.
27853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidateElem(vctxt);
27855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret == -1) {
27857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaDocWalk",
27858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidateElem()");
27859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
27862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* Don't stop validation; just skip the content
27863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		* of this element.
27864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*/
27865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_node;
27866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((vctxt->skipDepth != -1) &&
27868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(vctxt->depth >= vctxt->skipDepth))
27869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto leave_node;
27870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((node->type == XML_TEXT_NODE) ||
27871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_CDATA_SECTION_NODE)) {
27872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Process character content.
27874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((ielem != NULL) && (ielem->flags & XML_SCHEMA_ELEM_INFO_EMPTY))
27876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ielem->flags ^= XML_SCHEMA_ELEM_INFO_EMPTY;
27877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaVPushText(vctxt, node->type, node->content,
27878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		-1, XML_SCHEMA_PUSH_TEXT_PERSIST, NULL);
27879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret < 0) {
27880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVDocWalk",
27881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "calling xmlSchemaVPushText()");
27882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: Should we skip further validation of the
27886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * element content here?
27887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((node->type == XML_ENTITY_NODE) ||
27889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_ENTITY_REF_NODE)) {
27890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: What to do with entities?
2789260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    */
27893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    VERROR_INT("xmlSchemaVDocWalk",
27894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"there is at least one entity reference in the node-tree "
27895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"currently being validated. Processing of entities with "
27896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"this XML Schema processor is not supported (yet). Please "
27897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		"substitute entities before validation.");
27898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto internal_error;
27899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
27900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto leave_node;
27901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * DOC VAL TODO: XInclude nodes, etc.
27903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Walk the doc.
27907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->children != NULL) {
27909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->children;
27910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    continue;
27911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectleave_node:
27913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->type == XML_ELEMENT_NODE) {
27914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
27915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    * Leaving the scope of an element.
27916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    */
27917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node != vctxt->inode->node) {
27918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		VERROR_INT("xmlSchemaVDocWalk",
27919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    "element position mismatch");
27920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto internal_error;
27921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = xmlSchemaValidatorPopElem(vctxt);
27923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (ret != 0) {
27924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ret < 0) {
27925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    VERROR_INT("xmlSchemaVDocWalk",
27926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"calling xmlSchemaValidatorPopElem()");
27927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    goto internal_error;
27928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
27929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
27930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node == valRoot)
27931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto exit;
27932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectnext_sibling:
27934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (node->next != NULL)
27935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->next;
27936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else {
27937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    node = node->parent;
27938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    goto leave_node;
27939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
27940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
27941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit:
27943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
27944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectinternal_error:
27945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
27946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
27947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
27948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
27949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPreRun(xmlSchemaValidCtxtPtr vctxt) {
27950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Some initialization.
2795260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    */
27953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->err = 0;
27954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->nberrors = 0;
27955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->depth = -1;
27956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->skipDepth = -1;
27957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->xsiAssemble = 0;
27958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->hasKeyrefs = 0;
27959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef ENABLE_IDC_NODE_TABLES_TEST
27960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->createIDCNodeTables = 1;
27961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
27962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    vctxt->createIDCNodeTables = 0;
27963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
27964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
27965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * Create a schema + parser if necessary.
27966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
27967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->schema == NULL) {
27968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaParserCtxtPtr pctxt;
2796960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
27970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->xsiAssemble = 1;
2797160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
27972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* If not schema was given then we will create a schema
27973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* dynamically using XSI schema locations.
27974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*
27975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema parser context.
27976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((vctxt->pctxt == NULL) &&
27978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   (xmlSchemaCreatePCtxtOnVCtxt(vctxt) == -1))
27979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	   return (-1);
27980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt = vctxt->pctxt;
27981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->xsiAssemble = 1;
27982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema.
27984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	vctxt->schema = xmlSchemaNewSchema(pctxt);
27986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->schema == NULL)
2798760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    return (-1);
2798860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	/*
27989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Create the schema construction context.
27990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->constructor = xmlSchemaConstructionCtxtCreate(pctxt->dict);
27992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (pctxt->constructor == NULL)
27993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return(-1);
27994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->constructor->mainSchema = vctxt->schema;
27995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
27996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* Take ownership of the constructor to be able to free it.
27997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
27998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->ownsConstructor = 1;
2799960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
2800060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /*
2800160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    * Augment the IDC definitions for the main schema and all imported ones
28002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    * NOTE: main schema if the first in the imported list
28003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    */
28004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashScan(vctxt->schema->schemasImports,(xmlHashScanner)xmlSchemaAugmentImportedIDC, vctxt);
2800560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaPostRun(xmlSchemaValidCtxtPtr vctxt) {
28011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->xsiAssemble) {
28012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (vctxt->schema != NULL) {
28013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFree(vctxt->schema);
28014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    vctxt->schema = NULL;
28015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
28016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaClearValidCtxt(vctxt);
28018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaVStart(xmlSchemaValidCtxtPtr vctxt)
28022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
28024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlSchemaPreRun(vctxt) < 0)
28026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
28027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (vctxt->doc != NULL) {
28029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Tree validation.
28031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVDocWalk(vctxt);
28033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_READER_ENABLED
28034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (vctxt->reader != NULL) {
28035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * XML Reader validation.
28037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef XML_SCHEMA_READER_ENABLED
28039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlSchemaVReaderWalk(vctxt);
28040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
28042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((vctxt->sax != NULL) && (vctxt->parserCtxt != NULL)) {
28043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * SAX validation.
28045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = xmlParseDocument(vctxt->parserCtxt);
28047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	VERROR_INT("xmlSchemaVStart",
28049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "no instance to validate");
28050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = -1;
28051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPostRun(vctxt);
28054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
28055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = vctxt->err;
28056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateOneElement:
28061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element node
28063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a branch of a tree, starting with the given @elem.
28065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the element and its subtree is valid, a positive error
28067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * code number otherwise and -1 in case of an internal or API error.
28068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateOneElement(xmlSchemaValidCtxtPtr ctxt, xmlNodePtr elem)
28071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elem == NULL) || (elem->type != XML_ELEMENT_NODE))
28073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->schema == NULL)
28076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = elem->doc;
28079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->node = elem;
28080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->validationRoot = elem;
28081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlSchemaVStart(ctxt));
28082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateDoc:
28086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a parsed document tree
28088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory.
28090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is schemas valid, a positive error code
28092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
28093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateDoc(xmlSchemaValidCtxtPtr ctxt, xmlDocPtr doc)
28096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (doc == NULL))
28098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = doc;
28101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->node = xmlDocGetRootElement(doc);
28102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->node == NULL) {
28103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaCustomErr(ACTXT_CAST ctxt,
28104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    XML_SCHEMAV_DOCUMENT_ELEMENT_MISSING,
28105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlNodePtr) doc, NULL,
28106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "The document has no document element", NULL, NULL);
28107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ctxt->err);
28108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->validationRoot = ctxt->node;
28110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlSchemaVStart(ctxt));
28111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
28115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
28116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Function and data for SAX streaming API			*
28117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
28118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
28119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchemaSplitSAXData xmlSchemaSplitSAXData;
28120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchemaSplitSAXData *xmlSchemaSplitSAXDataPtr;
28121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSplitSAXData {
28123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      user_sax;
28124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                 *user_data;
28125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ctxt;
28126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      schemas_sax;
28127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
28128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SAX_PLUG_MAGIC 0xdc43ba21
28130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchemaSAXPlug {
28132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int magic;
28133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the original callbacks informations */
28135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr     *user_sax_ptr;
28136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr      user_sax;
28137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                **user_data_ptr;
28138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void                 *user_data;
28139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the block plugged back and validation informations */
28141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandler         schemas_sax;
28142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValidCtxtPtr ctxt;
28143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
28144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* All those functions just bounces to the user provided SAX handlers */
28146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectinternalSubsetSplit(void *ctx, const xmlChar *name,
28148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       const xmlChar *ExternalID, const xmlChar *SystemID)
28149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->internalSubset != NULL))
28153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->internalSubset(ctxt->user_data, name, ExternalID,
28154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               SystemID);
28155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectisStandaloneSplit(void *ctx)
28159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->isStandalone != NULL))
28163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->isStandalone(ctxt->user_data));
28164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthasInternalSubsetSplit(void *ctx)
28169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->hasInternalSubset != NULL))
28173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->hasInternalSubset(ctxt->user_data));
28174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
28178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthasExternalSubsetSplit(void *ctx)
28179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->hasExternalSubset != NULL))
28183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->hasExternalSubset(ctxt->user_data));
28184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectexternalSubsetSplit(void *ctx, const xmlChar *name,
28189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	       const xmlChar *ExternalID, const xmlChar *SystemID)
28190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
2819360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (ctxt->user_sax->externalSubset != NULL))
2819460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->user_sax->externalSubset(ctxt->user_data, name, ExternalID,
28195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               SystemID);
28196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlParserInputPtr
28199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectresolveEntitySplit(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
28200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->resolveEntity != NULL))
28204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->resolveEntity(ctxt->user_data, publicId,
28205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                     systemId));
28206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr
28210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectgetEntitySplit(void *ctx, const xmlChar *name)
28211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->getEntity != NULL))
28215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->getEntity(ctxt->user_data, name));
28216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlEntityPtr
28220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectgetParameterEntitySplit(void *ctx, const xmlChar *name)
28221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->getParameterEntity != NULL))
28225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(ctxt->user_sax->getParameterEntity(ctxt->user_data, name));
28226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
28227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectentityDeclSplit(void *ctx, const xmlChar *name, int type,
28232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
28233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->entityDecl != NULL))
28237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->entityDecl(ctxt->user_data, name, type, publicId,
28238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                           systemId, content);
28239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectattributeDeclSplit(void *ctx, const xmlChar * elem,
28243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   const xmlChar * name, int type, int def,
28244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   const xmlChar * defaultValue, xmlEnumerationPtr tree)
28245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->attributeDecl != NULL)) {
28249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->attributeDecl(ctxt->user_data, elem, name, type,
28250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                              def, defaultValue, tree);
28251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeEnumeration(tree);
28253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectelementDeclSplit(void *ctx, const xmlChar *name, int type,
28258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlElementContentPtr content)
28259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->elementDecl != NULL))
28263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->elementDecl(ctxt->user_data, name, type, content);
28264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectnotationDeclSplit(void *ctx, const xmlChar *name,
28268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     const xmlChar *publicId, const xmlChar *systemId)
28269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->notationDecl != NULL))
28273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->notationDecl(ctxt->user_data, name, publicId,
28274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                             systemId);
28275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectunparsedEntityDeclSplit(void *ctx, const xmlChar *name,
28279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *publicId, const xmlChar *systemId,
28280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   const xmlChar *notationName)
28281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->unparsedEntityDecl != NULL))
28285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->unparsedEntityDecl(ctxt->user_data, name, publicId,
28286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                   systemId, notationName);
28287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectsetDocumentLocatorSplit(void *ctx, xmlSAXLocatorPtr loc)
28291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->setDocumentLocator != NULL))
28295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->setDocumentLocator(ctxt->user_data, loc);
28296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectstartDocumentSplit(void *ctx)
28300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->startDocument != NULL))
28304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->startDocument(ctxt->user_data);
28305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectendDocumentSplit(void *ctx)
28309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->endDocument != NULL))
28313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->endDocument(ctxt->user_data);
28314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectprocessingInstructionSplit(void *ctx, const xmlChar *target,
28318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const xmlChar *data)
28319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->processingInstruction != NULL))
28323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->processingInstruction(ctxt->user_data, target, data);
28324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcommentSplit(void *ctx, const xmlChar *value)
28328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->comment != NULL))
28332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->comment(ctxt->user_data, value);
28333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
28336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Varargs error callbacks to the user application, harder ...
28337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectwarningSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->warning != NULL)) {
28344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecterrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->error != NULL)) {
28352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void XMLCDECL
28356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectfatalErrorSplit(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
28357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->fatalError != NULL)) {
28360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	TODO
28361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
28365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Those are function where both the user handler and the schemas handler
28366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * need to be called.
28367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcharactersSplit(void *ctx, const xmlChar *ch, int len)
28370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) && (ctxt->user_sax->characters != NULL))
28375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->characters(ctxt->user_data, ch, len);
28376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
28378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectignorableWhitespaceSplit(void *ctx, const xmlChar *ch, int len)
28382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->ignorableWhitespace != NULL))
28388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->ignorableWhitespace(ctxt->user_data, ch, len);
28389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleText(ctxt->ctxt, ch, len);
28391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectcdataBlockSplit(void *ctx, const xmlChar *value, int len)
28395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
2840060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        (ctxt->user_sax->cdataBlock != NULL))
2840160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	ctxt->user_sax->cdataBlock(ctxt->user_data, value, len);
28402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleCDataSection(ctxt->ctxt, value, len);
28404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
28407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectreferenceSplit(void *ctx, const xmlChar *name)
28408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->user_sax != NULL) &&
28413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->reference != NULL))
28414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->reference(ctxt->user_data, name);
28415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaSAXHandleReference(ctxt->user_data, name);
28417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2842060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottstartElementNsSplit(void *ctx, const xmlChar * localname,
2842160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    const xmlChar * prefix, const xmlChar * URI,
2842260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    int nb_namespaces, const xmlChar ** namespaces,
2842360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott		    int nb_attributes, int nb_defaulted,
28424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar ** attributes) {
28425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->startElementNs != NULL))
28430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->startElementNs(ctxt->user_data, localname, prefix,
28431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                               URI, nb_namespaces, namespaces,
28432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       nb_attributes, nb_defaulted,
28433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				       attributes);
28434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleStartElementNs(ctxt->ctxt, localname, prefix,
28436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                                 URI, nb_namespaces, namespaces,
28437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 nb_attributes, nb_defaulted,
28438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project					 attributes);
28439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2844260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottendElementNsSplit(void *ctx, const xmlChar * localname,
28443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    const xmlChar * prefix, const xmlChar * URI) {
28444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ctxt = (xmlSchemaSAXPlugPtr) ctx;
28445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
28446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
28447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->user_sax != NULL) &&
28448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->user_sax->endElementNs != NULL))
28449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ctxt->user_sax->endElementNs(ctxt->user_data, localname, prefix, URI);
28450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->ctxt != NULL)
28451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlSchemaSAXHandleEndElementNs(ctxt->ctxt, localname, prefix, URI);
28452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSAXPlug:
28456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax:  a pointer to the original xmlSAXHandlerPtr
28458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data:  a pointer to the original SAX user data pointer
28459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Plug a SAX based validation layer in a SAX parsing event flow.
28461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The original @saxptr and @dataptr data are replaced by new pointers
28462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * but the calls to the original will be maintained.
28463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to a data structure needed to unplug the validation layer
28465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         or NULL in case of errors.
28466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXPlugPtr
28468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXPlug(xmlSchemaValidCtxtPtr ctxt,
28469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 xmlSAXHandlerPtr *sax, void **user_data)
28470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr ret;
28472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr old_sax;
28473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (sax == NULL) || (user_data == NULL))
28475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We only allow to plug into SAX2 event streams
28479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_sax = *sax;
28481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((old_sax != NULL) && (old_sax->initialized != XML_SAX2_MAGIC))
28482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
2848360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if ((old_sax != NULL) &&
28484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (old_sax->startElementNs == NULL) && (old_sax->endElementNs == NULL) &&
28485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((old_sax->startElement != NULL) || (old_sax->endElement != NULL)))
28486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * everything seems right allocate the local data needed for that layer
28490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlSchemaSAXPlugPtr) xmlMalloc(sizeof(xmlSchemaSAXPlugStruct));
28492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
28493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
28494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlSchemaSAXPlugStruct));
28496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->magic = XML_SAX_PLUG_MAGIC;
28497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schemas_sax.initialized = XML_SAX2_MAGIC;
28498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->ctxt = ctxt;
28499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user_sax_ptr = sax;
28500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->user_sax = old_sax;
2850160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (old_sax == NULL) {
28502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
28503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * go direct, no need for the split block and functions.
28504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.startElementNs = xmlSchemaSAXHandleStartElementNs;
28506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.endElementNs = xmlSchemaSAXHandleEndElementNs;
28507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Note that we use the same text-function for both, to prevent
28509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * the parser from testing for ignorable whitespace.
28510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.ignorableWhitespace = xmlSchemaSAXHandleText;
28512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.characters = xmlSchemaSAXHandleText;
28513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.cdataBlock = xmlSchemaSAXHandleCDataSection;
28515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->schemas_sax.reference = xmlSchemaSAXHandleReference;
28516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data = ctxt;
28518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = ctxt;
28519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
28520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project       /*
28521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        * for each callback unused by Schemas initialize it to the Split
2852260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	* routine only if non NULL in the user block, this can speed up
28523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	* things at the SAX level.
28524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*/
28525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->internalSubset != NULL)
28526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.internalSubset = internalSubsetSplit;
28527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->isStandalone != NULL)
28528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.isStandalone = isStandaloneSplit;
28529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->hasInternalSubset != NULL)
28530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.hasInternalSubset = hasInternalSubsetSplit;
28531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->hasExternalSubset != NULL)
28532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.hasExternalSubset = hasExternalSubsetSplit;
28533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->resolveEntity != NULL)
28534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.resolveEntity = resolveEntitySplit;
28535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->getEntity != NULL)
28536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.getEntity = getEntitySplit;
28537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->entityDecl != NULL)
28538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.entityDecl = entityDeclSplit;
28539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->notationDecl != NULL)
28540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.notationDecl = notationDeclSplit;
28541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->attributeDecl != NULL)
28542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.attributeDecl = attributeDeclSplit;
28543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->elementDecl != NULL)
28544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.elementDecl = elementDeclSplit;
28545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->unparsedEntityDecl != NULL)
28546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.unparsedEntityDecl = unparsedEntityDeclSplit;
28547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->setDocumentLocator != NULL)
28548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.setDocumentLocator = setDocumentLocatorSplit;
28549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->startDocument != NULL)
28550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.startDocument = startDocumentSplit;
28551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->endDocument != NULL)
28552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.endDocument = endDocumentSplit;
28553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->processingInstruction != NULL)
28554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.processingInstruction = processingInstructionSplit;
28555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->comment != NULL)
28556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.comment = commentSplit;
28557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->warning != NULL)
28558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.warning = warningSplit;
28559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->error != NULL)
28560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.error = errorSplit;
28561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->fatalError != NULL)
28562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.fatalError = fatalErrorSplit;
28563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->getParameterEntity != NULL)
28564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.getParameterEntity = getParameterEntitySplit;
28565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old_sax->externalSubset != NULL)
28566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->schemas_sax.externalSubset = externalSubsetSplit;
28567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	/*
28569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * the 6 schemas callback have to go to the splitter functions
28570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * Note that we use the same text-function for ignorableWhitespace
28571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * if possible, to prevent the parser from testing for ignorable
28572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 * whitespace.
28573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	 */
28574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.characters = charactersSplit;
28575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((old_sax->ignorableWhitespace != NULL) &&
28576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (old_sax->ignorableWhitespace != old_sax->characters))
28577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->schemas_sax.ignorableWhitespace = ignorableWhitespaceSplit;
28578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
28579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret->schemas_sax.ignorableWhitespace = charactersSplit;
28580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.cdataBlock = cdataBlockSplit;
28581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.reference = referenceSplit;
28582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.startElementNs = startElementNsSplit;
28583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->schemas_sax.endElementNs = endElementNsSplit;
28584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data_ptr = user_data;
28586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->user_data = *user_data;
28587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = ret;
28588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * plug the pointers back.
28592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *sax = &(ret->schemas_sax);
28594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = *sax;
28595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPreRun(ctxt);
28597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
28598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaSAXUnplug:
28602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @plug:  a data structure returned by xmlSchemaSAXPlug
28603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Unplug a SAX based validation layer in a SAX parsing event flow.
28605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The original pointers used in the call are restored.
28606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of failure.
28608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaSAXUnplug(xmlSchemaSAXPlugPtr plug)
28611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr *sax;
28613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void **user_data;
28614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((plug == NULL) || (plug->magic != XML_SAX_PLUG_MAGIC))
28616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
28617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    plug->magic = 0;
28618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaPostRun(plug->ctxt);
28620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* restore the data */
28621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    sax = plug->user_sax_ptr;
28622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *sax = plug->user_sax;
28623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug->user_sax != NULL) {
28624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	user_data = plug->user_data_ptr;
28625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*user_data = plug->user_data;
28626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* free and return */
28629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(plug);
28630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
28631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateStream:
28635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
28636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @input:  the input to use for reading the data
28637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @enc:  an optional encoding information
28638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @sax:  a SAX handler for the resulting events
28639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @user_data:  the context to provide to the SAX handler.
28640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an input based on a flow of SAX event from the parser
28642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and forward the events to the @sax handler with the provided @user_data
28643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the user provided @sax handler must be a SAX2 one.
28644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is schemas valid, a positive error code
28646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
28647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateStream(xmlSchemaValidCtxtPtr ctxt,
28650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlParserInputBufferPtr input, xmlCharEncoding enc,
28651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlSAXHandlerPtr sax, void *user_data)
28652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaSAXPlugPtr plug = NULL;
28654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSAXHandlerPtr old_sax = NULL;
28655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserCtxtPtr pctxt = NULL;
28656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputPtr inputStream = NULL;
28657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
28658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (input == NULL))
28660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * prepare the parser
28664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt = xmlNewParserCtxt();
28666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt == NULL)
28667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
28668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_sax = pctxt->sax;
28669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->sax = sax;
28670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    pctxt->userData = user_data;
28671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
28672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (options)
28673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlCtxtUseOptions(pctxt, options);
28674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2867560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    pctxt->linenumbers = 1;
28676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inputStream = xmlNewIOInputStream(pctxt, input, enc);;
28678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (inputStream == NULL) {
28679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
28680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto done;
28681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    inputPush(pctxt, inputStream);
28683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->parserCtxt = pctxt;
28684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = input;
28685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
28687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Plug the validation and launch the parsing
28688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
28689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    plug = xmlSchemaSAXPlug(ctxt, &(pctxt->sax), &(pctxt->userData));
28690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug == NULL) {
28691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
28692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	goto done;
28693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = input;
28695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->enc = enc;
28696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = pctxt->sax;
28697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_SCHEMA_VALID_CTXT_FLAG_STREAM;
28698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaVStart(ctxt);
28699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (! ctxt->parserCtxt->wellFormed)) {
28701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret = ctxt->parserCtxt->errNo;
28702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (ret == 0)
28703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ret = 1;
2870460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    }
28705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone:
28707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->parserCtxt = NULL;
28708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->sax = NULL;
28709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->input = NULL;
28710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (plug != NULL) {
28711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaSAXUnplug(plug);
28712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* cleanup */
28714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pctxt != NULL) {
28715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	pctxt->sax = old_sax;
28716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlFreeParserCtxt(pctxt);
28717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
28718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
28722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchemaValidateFile:
28723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context
28724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename: the URI of the instance
28725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a future set of options, currently unused
28726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do a schemas validation of the given resource, it will use the
28728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * SAX streamable validation internally.
28729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
28730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code
28731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of an internal or API error.
28732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
28733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
28734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchemaValidateFile(xmlSchemaValidCtxtPtr ctxt,
28735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      const char * filename,
28736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		      int options ATTRIBUTE_UNUSED)
28737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
28738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
28739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlParserInputBufferPtr input;
28740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
28741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (filename == NULL))
28742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2874360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    input = xmlParserInputBufferCreateFilename(filename,
28745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	XML_CHAR_ENCODING_NONE);
28746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (input == NULL)
28747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
28748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateStream(ctxt, input, XML_CHAR_ENCODING_NONE,
2874960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	NULL, NULL);
28750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
28751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
28752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2875360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/**
2875460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchemaValidCtxtGetParserCtxt:
2875560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a schema validation context
2875660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2875760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * allow access to the parser context of the schema validation context
2875860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *
2875960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Returns the parser context of the schema validation context or NULL
2876060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott *         in case of error.
2876160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
2876260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlParserCtxtPtr
2876360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt)
2876460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{
2876560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    if (ctxt == NULL)
2876660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott        return(NULL);
2876760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    return (ctxt->parserCtxt);
2876860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott}
2876960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
28770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlschemas
28771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
28772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */
28773